postgresで巨大レコード数のtableを扱うなら、パーティショニング - end0tknr's kipple - web写経開発
以前、postgresのパーティショニングには触れましたが、今回はmysql5.1.34のパーティショニングを試したいと思います。
have_partitioning=NOの場合、再make
http://dev.mysql.com/doc/refman/5.1/ja/partitioning-overview.html
パーティショニングの可否は、SHOW VARIABLES で確認できますが、have_partitioning=NO の場合、configureのオプションに --with-plugins=partition を追加して、再makeする必要があります。
mysql> SHOW VARIABLES LIKE '%PARTITION%'; +-------------------+-------+ | Variable_name | Value | +-------------------+-------+ | have_partitioning | YES | +-------------------+-------+ 1 row in set (0.00 sec)
私の環境でのconfigureオプションは次の通り
$ ./configure --prefix=/usr/local/mysql \ --with-plugins=innobase,partition \ --with-charset=utf8 \ --with-extra-charsets=all \ --with-mysqld-user=mysql
ALTER TABLEにより既存テーブルのパーティショニングも可能
テーブルのパーティショニング化は、CREATE TABLE 時に指定するケースが多いかも知れませんが、ALTER TABLEによる既存テーブルのパーティショニングも可能です。
CREATE TABLE時に指定する場合
CREATE TABLE juchuu_meisai ( juchuu_id int, row_id int, hinmei varchar(40), hinban varchar(40), quantity float, primary key(juchuu_id,row_id) ) PARTITION BY RANGE( juchuu_id ) ( PARTITION p_0 VALUES LESS THAN (5), PARTITION p_1 VALUES LESS THAN (10), PARTITION p_max VALUES LESS THAN MAXVALUE );
ALTER TABLE時に指定する場合
ALTER TABLE juchuu_meisai PARTITION BY RANGE( juchuu_id ) ( PARTITION p_0 VALUES LESS THAN (5), PARTITION p_1 VALUES LESS THAN (10), PARTITION p_max VALUES LESS THAN MAXVALUE );
パーティショニング対象のテーブルに既にレコードが登録されている場合も問題ないようです。
パーティショニングの状態は、INFORMATION_SCHEMA.PARTITIONS で確認
パーティショニングの状態はINFORMATION_SCHEMA.PARTITIONS で確認できます。
先程のjuchuu_meisaiの状態を確認すると次のように表示されます。
mysql> SELECT * FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME='juchuu_meisai'\G <略> *************************** 3. row *************************** PARTITION_NAME: p_0 PARTITION_ORDINAL_POSITION: 1 TABLE_ROWS: 4 <略> *************************** 4. row *************************** PARTITION_NAME: p_1 PARTITION_ORDINAL_POSITION: 2 TABLE_ROWS: 5 <略> *************************** 5. row *************************** PARTITION_NAME: p_max PARTITION_ORDINAL_POSITION: 3 TABLE_ROWS: 2 <略>
その他のパーティショニング変更方法
参考までに、その他のパーティショニング変更方法も記載しておきます。
#パーティショニングの解除 > ALTER TABLE juchuu_meisai REMOVE PARTITIONING; #パーティショニングテーブルの削除 > ALTER TABLE juchuu_meisai ADD PARTITION ( PARTITION p_max VALUES LESS THAN MAXVALUE); #パーティショニングテーブルの追加 > ALTER TABLE juchuu_meisai ADD PARTITION ( PARTITION p4 VALUES LESS THAN (50));
postgresの場合、パーティショニングの作成や振分ルール等を自分で行う必要があるので、mysqlの方が簡単そうですね。