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の方が簡単そうですね。