VillageSQL is a drop-in replacement for MySQL with extensions.
All examples on this page work on VillageSQL. Install Now →
パーティショニングが役立つ場合
パーティションプルーニングが本当に効果を発揮するのは次の場合です。- テーブルがバッファプールに収まらないほど大きく、クエリが一貫してパーティションキーで絞り込む
- 古いデータを定期的に削除する。
ALTER TABLE t DROP PARTITION p_oldは、遅い DELETE と違って瞬時に完了する
- クエリがパーティションキーで絞り込まない(すべてのパーティションをスキャンする必要がある)
- テーブルがメモリに余裕を持って収まる
- 適切なインデックス作成の代わりにしようとしている。パーティションのないテーブルの良いインデックスは、対応するインデックスのないパーティションテーブルより高速なことが多い
RANGE パーティショニング
行は、パーティションキーがある範囲に含まれるかどうかに基づいてパーティションに割り当てられます。最も一般的な用途は日付ベースのアーカイブです。MAXVALUE パーティションを含めてください。これがないと、定義した範囲の外への挿入はエラーで失敗します。
新しいパーティションを追加します。
LIST パーティショニング
行は、パーティションキーの正確な値に基づいて割り当てられます。LIST COLUMNS を使ってください。LIST 単独では整数の式しかサポートしません。
HASH および KEY パーティショニング
HASH と KEY は、固定数のパーティションに行を均等に分散します。値によるパーティションプルーニングはサポートしませんが、行をパーティション間に分散することで、同時書き込みのスループットを改善できます。
パーティションプルーニング
プルーニングは、WHERE 句がパーティション式で直接絞り込む場合にのみ働きます。RANGE COLUMNS (created_at) では、created_at での絞り込みが正しくプルーニングされます。
EXPLAIN を実行して partitions 列を調べます。
partitions に 1 つまたは少数のパーティション名しか表示されなければ、プルーニングは機能しています。すべてのパーティションが表示される場合、絞り込みは適用されていません。
パーティショニングの制約
- すべてのユニークキー(主キーを含む)は、パーティショニング式のすべての列を含まなければなりません。
created_atでパーティショニングしたい場合、すべてのユニークキーにcreated_atが含まれている必要があります。単独のPRIMARY KEY (id)を持つテーブルには、先にPRIMARY KEY (id, created_at)に変更しない限りパーティションを追加できません。 - MySQL では、パーティションテーブルで
FOREIGN KEY制約はサポートされません。 - 1 つのテーブルは最大 8192 のパーティションを持てます(MySQL 8.0 以降)。
パーティショニングとインデックス作成の比較
インデックス作成から始めてください。パーティショニングを追加するのは、大きなテーブルで実証されたパフォーマンス問題があり、クエリのパターンに合った明確なパーティションキーがある場合だけにしてください。
よくある質問
既存のテーブルをパーティショニングできますか?
はい。ALTER TABLE を使います。
行がどのパーティションにあるかを確認するには?
EXPLAIN PARTITIONS を使います。
トラブルシューティング
関連項目
- InnoDB がデータを保存する仕組み — パーティショニングが動作するストレージエンジン
- MySQL のインデックスの仕組み — パーティション内のインデックスとパーティションプルーニング
- MySQL のスキーマ移行 — 既存のテーブルにパーティショニングを追加または変更する方法