2013-10-14 6 views
7

私は、ユーザクリックのような多くの追跡イベントを格納する巨大なテーブルを持っています。月ごとのMySQLテーブルパーティション

テーブルはすでに数百万の10にあり、毎日大きくなっています。 大規模な時間枠からイベントを取得しようとするとクエリが遅くなり始め、対象をかなり読み込んだ後にテーブルを分割するとパフォーマンスが向上する可能性があることを理解しています。

私がやりたいことは、月ごとにテーブルを分割することです。

私は毎月手動でパーティションを分割する方法を示すガイドしか見つけられていませんが、MySQLに月単位でパーティションを設定する方法はありますか?

もしそうでなければ、パーティション化された列がdatetimeであると手動で検討するコマンドは何ですか?

答えて

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

確かに、この特定のハッシング方法。また、 – Wolph

+0

の 'YEAR(tr_date)* 12 + MONTH(tr_date)'を行うことができます。もし私がYEARとMONTHの両方に基づいてハッシュしたいのなら、 'HASH(CONCAT(YEAR(datetimefield)、MONTH – shaharmor

-4

アクセス時間がテーブルサイズに依存しないTokuDbを使用します。

関連する問題