2011-06-22 88 views
3

對不起,如果這是一個愚蠢的問題,但新的這一點,所以需要一些幫助來理解一些事情。我目前升級MySQL到5.1,所以我可以在MySQL中使用分區。我的問題是,如果我對錶進行分區,包括修剪過程在內的分區表是否仍然使用連接進行查詢,或者如果您只是查詢具有分區的表,就是最佳分區?Mysql分區和連接

編輯

下面是一個例子查詢:

SELECT event.*,site.* FROM event INNER JOIN site ON event.siteid = site.id 
WHERE event.eventdate >= [somedate] AND event.eventdate <= [somedate] 
AND event.siteid = [siteid] 

與我曾使用EVENTDATE場事件表的分區設置。 MySQL仍然能夠使用事件表上的分區,包括修剪過程嗎?

回答

3

分區表可用於連接。

調整where子句以僅包含一個分區以獲得最佳性能。
例如如果按年分區,你可以做一個連接:

select * from a 
inner join partioned_table p on (p.id = a.id) 
where p.year = '2011'; 

此查詢將使用和不使用where子句,而且適用於where子句它會更快,因爲你只訪問一個分區。
如果您訪問更多的分區,MySQL必須使用臨時表將分區拼接在一起,然後才能進行連接。
這種打破分區的目的。

+0

包含一個分區的含義是什麼?有沒有你提到的例子?如果查詢的日期屬於多個分區,該怎麼辦?我使用示例查詢 – John

+0

更新了我的原始帖子,所以我想我應該在一年之前將表格打破,那麼因爲如果按月份做,它會增加正確掃描多個分區的機會? – John

+1

@John,如果你想要性能,你應該拆分你的分區,所以你幾乎不會從多個分區查詢。如果你不把月份分成幾個月,那當然是好的,這取決於。 – Johan

0

不知道我很好地理解了這個問題,但分區不應該影響您的連接工作方式。它隻影響數據的存儲方式。 MySQL引擎會關心如何獲取數據,所以實際上你應該保持你的連接方式。這裏是一個例子:

CREATE TABLE members (
    firstname VARCHAR(25) NOT NULL, 
    lastname VARCHAR(25) NOT NULL, 
    username VARCHAR(16) NOT NULL, 
    email VARCHAR(35), 
    joined DATE NOT NULL 
) 
PARTITION BY RANGE(YEAR(joined)) (
    PARTITION p0 VALUES LESS THAN (1960), 
    PARTITION p1 VALUES LESS THAN (1970), 
    PARTITION p2 VALUES LESS THAN (1980), 
    PARTITION p3 VALUES LESS THAN (1990), 
    PARTITION p4 VALUES LESS THAN MAXVALUE 
); 

select a.* 
from members a, subscriptions b 
where a.email = b.email and b.generation='X' 
    and a.joined between '1980-01-01' and now() 

讓我知道這是否合理! Marcelo

+0

這很有道理。我的問題是,分區如何處理索引?在您的查詢中,您通過電子郵件加入了這些表格,但在您的create語句中,您沒有任何索引。那麼如何才能優化?你能在分區表上沒有任何索引嗎? – John

+0

@約翰,你可以沒有問題!在mysql論壇中有你的問題的線程。讓我把它[http://forums.mysql.com/read.php?106,202130,202140#msg-202140](這裏)。根據該主題,「如果你有一個按月分區的表,並在該表上創建一個索引,它也將有效地按月分區。」 – marcelo

+0

因此,如果我的成員表中有電子郵件索引,它不會導致分區的任何問題?另外如果我在事件表中有一個主要的自動遞增鍵?這會影響分區嗎? – John