メインコンテンツへスキップ

VillageSQL is a drop-in replacement for MySQL with extensions.

All examples on this page work on VillageSQL. Install Now →
パーティショニングは、1 つの論理テーブルを複数の物理セグメントに分割します。MySQL はパーティショニング式に基づいて行をパーティションに振り分け、パーティションキーで絞り込むクエリはパーティション全体をスキップできます。この最適化をパーティションプルーニングと呼びます。パーティショニングには InnoDB または NDB ストレージエンジンが必要です。

パーティショニングが役立つ場合

パーティションプルーニングが本当に効果を発揮するのは次の場合です。
  • テーブルがバッファプールに収まらないほど大きく、クエリが一貫してパーティションキーで絞り込む
  • 古いデータを定期的に削除する。ALTER TABLE t DROP PARTITION p_old は、遅い DELETE と違って瞬時に完了する
パーティショニングが役に立たないのは次の場合です。
  • クエリがパーティションキーで絞り込まない(すべてのパーティションをスキャンする必要がある)
  • テーブルがメモリに余裕を持って収まる
  • 適切なインデックス作成の代わりにしようとしている。パーティションのないテーブルの良いインデックスは、対応するインデックスのないパーティションテーブルより高速なことが多い

RANGE パーティショニング

行は、パーティションキーがある範囲に含まれるかどうかに基づいてパーティションに割り当てられます。最も一般的な用途は日付ベースのアーカイブです。
定義したどの範囲にも収まらない行を受け止めるために、必ず MAXVALUE パーティションを含めてください。これがないと、定義した範囲の外への挿入はエラーで失敗します。 新しいパーティションを追加します。
古いデータを瞬時に削除します。

LIST パーティショニング

行は、パーティションキーの正確な値に基づいて割り当てられます。
どのパーティションにも列挙されていない region での挿入は失敗します。文字列の列には 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 を使います。
これはテーブルを書き換えるため、大きなテーブルではかなりの時間とディスク領域がかかることがあります。

行がどのパーティションにあるかを確認するには?

特定の行がどのパーティションに入るかを確認するには、その行に一致する WHERE 句を付けて EXPLAIN PARTITIONS を使います。

トラブルシューティング

関連項目