Database JUNKY

MySQL,MariaDBを中心としたブログです

mysql:検証!レンジパーティション表でパーティションキーを変更

レンジパーティショニングの設定でプライマリキーを変更した場合、パーティションの再割り当てをしてくれるのか? を検証してみました。そりゃそうだよね?という結果でしたが、なんか感動しました。

▼テストテーブルの作成 create table pt_test ( id int not null, detail varchar(20), PRIMARY KEY (id) );

パーティション化 alter table pt_test PARTITION BY RANGE (id) ( PARTITION p00 VALUES LESS THAN (10), PARTITION p10 VALUES LESS THAN (20), PARTITION p20 VALUES LESS THAN (30), PARTITION pover VALUES LESS THAN MAXVALUE );

▼初回データ投入 insert into pt_test values (5,'test5'); insert into pt_test values (15,'test15'); insert into pt_test values (25,'test25'); insert into pt_test values (100,'test100');

▼結果確認 select TABLE_SCHEMA,TABLE_NAME,PARTITION_NAME,PARTITION_ORDINAL_POSITION,TABLE_ROWS from INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_NAME='pt_test';

+--------------+------------+----------------+----------------------------+------------+ | TABLE_SCHEMA | TABLE_NAME | PARTITION_NAME | PARTITION_ORDINAL_POSITION | TABLE_ROWS | +--------------+------------+----------------+----------------------------+------------+ | myDB          | pt_test    | p00            |                          1 |          1 | | myDB          | pt_test    | p10            |                          2 |          1 | | myDB          | pt_test    | p20            |                          3 |          1 | | myDB          | pt_test    | pover          |                          4 |          1 | +--------------+------------+----------------+----------------------------+------------+ 4 rows in set (0.01 sec)

▼プライマリキーを変更 mysql> update pt_test set id = 26 where id = 5 ; Query OK, 1 row affected (0.00 sec) Rows matched: 1  Changed: 1  Warnings: 0

mysql> update pt_test set id = 3 where id = 100 ; Query OK, 1 row affected (0.00 sec) Rows matched: 1  Changed: 1  Warnings: 0

▼結果確認 見ていただくとわかるとおり、key値のUPDATEによりパーティションが移動しているのがわかるかと 思います。頭いい!! +--------------+------------+----------------+----------------------------+------------+ | TABLE_SCHEMA | TABLE_NAME | PARTITION_NAME | PARTITION_ORDINAL_POSITION | TABLE_ROWS | +--------------+------------+----------------+----------------------------+------------+ | myDB          | pt_test    | p00            |                          1 |          1 | | myDB          | pt_test    | p10            |                          2 |          1 | | myDB          | pt_test    | p20            |                          3 |          2 | | myDB          | pt_test    | pover          |                          4 |          0 | +--------------+------------+----------------+----------------------------+------------+ 4 rows in set (0.00 sec)