我有一個巨大的表,存儲了許多跟蹤事件,如用戶點擊。MySQL表格分區按月
這張桌子已經有數百萬人了,每天都在增加。 當我嘗試從大時間範圍獲取事件時,查詢開始變慢,並且在閱讀了相當多的主題後,我明白分區表可能會提升性能。
我想要做的是每月分區表。
我只發現了指南,顯示如何手動分區每月,有沒有辦法告訴MySQL按月分區,它會自動做到這一點?
如果不是,手動執行此操作的命令是否考慮按列分區是日期時間?
我有一個巨大的表,存儲了許多跟蹤事件,如用戶點擊。MySQL表格分區按月
這張桌子已經有數百萬人了,每天都在增加。 當我嘗試從大時間範圍獲取事件時,查詢開始變慢,並且在閱讀了相當多的主題後,我明白分區表可能會提升性能。
我想要做的是每月分區表。
我只發現了指南,顯示如何手動分區每月,有沒有辦法告訴MySQL按月分區,它會自動做到這一點?
如果不是,手動執行此操作的命令是否考慮按列分區是日期時間?
如所解釋的通過手動: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)));
使用具有與表大小無關的訪問時間的TokuDb。
你的意思是說,一旦我劃分整整一年,下一年會去同一個分區? – shaharmor
的確,用這種特定的哈希方法。或者你可以做'YEAR(tr_date)* 12 + MONTH(tr_date)'當然是 – Wolph
,所以如果我想基於年和月的HASH,我可以做類似下面的事情:'HASH(CONCAT(YEAR(datetimefield),MONTH datetimefield))'或者應該是別的嗎? – shaharmor