partitionの追加方法
CREATE TABLE quarterly_report_status (
report_id INT NOT NULL,
report_status VARCHAR(20) NOT NULL,
report_updated TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)
PARTITION BY RANGE ( UNIX_TIMESTAMP(report_updated) ) (
PARTITION p0 VALUES LESS THAN ( UNIX_TIMESTAMP('2008-01-01 00:00:00') ),
PARTITION p1 VALUES LESS THAN ( UNIX_TIMESTAMP('2008-04-01 00:00:00') ),
PARTITION p2 VALUES LESS THAN ( UNIX_TIMESTAMP('2008-07-01 00:00:00') ),
PARTITION p3 VALUES LESS THAN ( UNIX_TIMESTAMP('2008-10-01 00:00:00') ),
PARTITION p4 VALUES LESS THAN ( UNIX_TIMESTAMP('2009-01-01 00:00:00') ),
PARTITION p5 VALUES LESS THAN ( UNIX_TIMESTAMP('2009-04-01 00:00:00') ),
PARTITION p6 VALUES LESS THAN ( UNIX_TIMESTAMP('2009-07-01 00:00:00') ),
PARTITION p7 VALUES LESS THAN ( UNIX_TIMESTAMP('2009-10-01 00:00:00') ),
PARTITION p8 VALUES LESS THAN ( UNIX_TIMESTAMP('2010-01-01 00:00:00') ),
PARTITION p9 VALUES LESS THAN (MAXVALUE)
);
上記例でいうと、
2008-01-01未満のreport_updated日付のデータはp0に格納され、
2008-01-01〜2008-04-01未満の日付のデータはp1に格納される。
なので、トランザクション系のデータは不要になったらパーティションごと削除するということが簡単に行える。
テーブル作成時に未来何年分か作成しておくとサービス稼働後に追加しなくて済むので楽。
RANGE COLUMNSはMySQL5.5から
partitionの削除方法
テーブルのパーティション指定でそのパーティションに格納されているデータを削除できる。
ALTER TABLE quarterly_report_status DROP PARTITION p2;
余談
ちなみに公式にこういう記述もあった。
従業員ジョブコードに基づいてテーブルをパーティション化できます。たとえば、正規従業員に 2 桁のジョブコード、オフィスおよびサポート従業員に 3 桁のコード、および管理職に 4 桁のコードが使用されると想定すると、次のステートメントを使用してパーティション化されたテーブルを作成できます。
従業員コードの採番ルールの定義帯を分別することによりこういうパーティション分割も可能というのはtimestampで設定できるのだから確かに、なるほどなと思った。
従業員コードを削除するのか?というのは置いておくとしてこういう定義の方法はどこかしらで使えそうだと思う。
CREATE TABLE employees (
id INT NOT NULL,
fname VARCHAR(30),
lname VARCHAR(30),
hired DATE NOT NULL DEFAULT '1970-01-01',
separated DATE NOT NULL DEFAULT '9999-12-31',
job_code INT NOT NULL,
store_id INT NOT NULL
)
PARTITION BY RANGE (job_code) (
PARTITION p0 VALUES LESS THAN (100),
PARTITION p1 VALUES LESS THAN (1000),
PARTITION p2 VALUES LESS THAN (10000)
);
参照:https://dev.mysql.com/doc/refman/5.6/ja/partitioning-range.html