end0tknr's kipple - web写経開発

太宰府天満宮の狛犬って、妙にカワイイ

mysql 5.1 のパーティショニングを試す

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