2013-10-14 146 views
7

我有一個巨大的表,存儲了許多跟蹤事件,如用戶點擊。MySQL表格分區按月

這張桌子已經有數百萬人了,每天都在增加。 當我嘗試從大時間範圍獲取事件時,查詢開始變慢,並且在閱讀了相當多的主題後,我明白分區表可能會提升性能。

我想要做的是每月分區表。

我只發現了指南,顯示如何手動分區每月,有沒有辦法告訴MySQL按月分區,它會自動做到這一點?

如果不是,手動執行此操作的命令是否考慮按列分區是日期時間?

回答

8

如所解釋的通過手動:http://dev.mysql.com/doc/refman/5.6/en/partitioning-overview.html

這是容易地在每個月的輸出散列分區。

CREATE TABLE ti (id INT, amount DECIMAL(7,2), tr_date DATE) 
    ENGINE=INNODB 
    PARTITION BY HASH(MONTH(tr_date)) 
    PARTITIONS 6; 

請注意,這只是分區按月而不是按年,也只有6個在這個例子中的分區(所以6個monhts)。

而對於分割現有的表(手冊:https://dev.mysql.com/doc/refman/5.7/en/alter-table-partition-operations.html):

ALTER TABLE ti 
    PARTITION BY HASH(MONTH(tr_date)) 
    PARTITIONS 6; 

查詢既可以從整個表來完成:

SELECT * from ti; 

或特定分區:

SELECT * from ti PARTITION (HASH(MONTH(some_date))); 
+0

你的意思是說,一旦我劃分整整一年,下一年會去同一個分區? – shaharmor

+2

的確,用這種特定的哈希方法。或者你可以做'YEAR(tr_date)* 12 + MONTH(tr_date)'當然是 – Wolph

+0

,所以如果我想基於年和月的HASH,我可以做類似下面的事情:'HASH(CONCAT(YEAR(datetimefield),MONTH datetimefield))'或者應該是別的嗎? – shaharmor

-4

使用具有與表大小無關的訪問時間的TokuDb。