レコード種別によるパーティションを行う場合のメモ
テーブル定義
動作確認のために, 以下のようなテーブルとデータを用意する
DROP TABLE IF EXISTS cards;
CREATE TABLE cards (
card_id int (11) NOT NULL AUTO_INCREMENT
, card_name varchar(255) NOT NULL
, card_type TYNYINT NOT NULL
, PRIMARY KEY (card_id, card_type)
) PARTITION BY HASH(card_type) PARTITIONS 5;
パーティショニングするカラムをプライマリキーに含めなければならない.
パーティション対象のカラムは数値型でなければならない.
今回はMySQLで用意されたハッシュ関数をもとにして各テーブルへの割り振りを行っているが
RANGE COLUMNS
や LIST COLUMNS
を使うことで, 割り振りのルールを自分で定義することもできる.
実行計画の確認
実行計画を調べるときはexplain
ではなくexplain partitions
を使う
MariaDB []> explain partitions select * from p_cards where card_type=2;
+------+-------------+---------+----------------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | Extra |
+------+-------------+---------+----------------+------+---------------+------+---------+------+------+-------------+
| 1 | SIMPLE | p_cards | p2 | ALL | NULL | NULL | NULL | NULL | 212 | Using where |
+------+-------------+---------+----------------+------+---------------+------+---------+------+------+-------------+
1 row in set (0.00 sec)
partitions
カラムで探索対象となったパーティションを知ることができる.