パーティショニング ぱーてぃしょにんぐ
パーティショニングテーブル分割大規模データシャーディングパフォーマンスデータ管理
パーティショニングについて教えて
簡単に言うとこんな感じ!
パーティショニングは「巨大な倉庫を「月別の棚」に仕切る整理術」だよ!1億件のレコードが1つの棚に全部あると探すのが大変。でも「2024年の棚」「2025年の棚」「2026年の棚」と仕切っておけば、2026年分だけの棚から探すだけで済む。それをデータベースに応用したのがパーティショニング!
パーティショニングとは
パーティショニング(Partitioning・テーブル分割) とは、大きなテーブルを一定のルールに従って複数の「パーティション(区画)」に物理的・論理的に分割し、管理しやすくする技術です。アプリケーションからは「1つのテーブル」に見えますが、内部的にはデータが複数のパーティションに分散して格納されています。
億単位のレコードを持つテーブルでは、インデックスだけではパフォーマンスの改善に限界があります。パーティショニングを使うと、クエリの条件(日付範囲など)に合致するパーティションだけを読み込む パーティションプルーニング(Partition Pruning) が働き、大幅な高速化が見込めます。
また、古いデータの削除も「パーティションごと丸ごと削除(DROP PARTITION)」できるため、DELETE 文で数千万件を削除するよりはるかに速く、ログ・履歴データの管理に非常に有効です。
パーティショニングの主な種類
| 種類 | 分割基準 | 例 | 向くケース |
|---|---|---|---|
| レンジ(Range) | 値の範囲で分割 | 月別・年別に分割 | 日付・数値レンジで検索が多いログデータ |
| リスト(List) | 値のリストで分割 | 地域コード・国コードで分割 | カテゴリ・地域などの離散値 |
| ハッシュ(Hash) | ハッシュ値で均等分割 | user_id のハッシュで4分割 | 均等分散させたい場合 |
| キー(Key) | DBが内部でハッシュ計算 | MySQLのKEYパーティション | 主キー・外部キーでの分散 |
| コンポジット | 上記の組み合わせ | 年別→さらにリストで分割 | 複合条件での高度な最適化 |
-- MySQLでのレンジパーティション(月別)
CREATE TABLE access_logs (
id BIGINT NOT NULL,
user_id INT,
accessed_at DATETIME NOT NULL,
url VARCHAR(500)
)
PARTITION BY RANGE (YEAR(accessed_at) * 100 + MONTH(accessed_at)) (
PARTITION p202601 VALUES LESS THAN (202602),
PARTITION p202602 VALUES LESS THAN (202603),
PARTITION p202603 VALUES LESS THAN (202604),
PARTITION p_future VALUES LESS THAN MAXVALUE
);
-- 古いパーティションを一括削除(超高速)
ALTER TABLE access_logs DROP PARTITION p202601;
歴史と背景
- 1990年代 — Oracle 8(1997年)がパーティショニング機能を搭載。大規模DWH(データウェアハウス)向けに実用化
- 2000年代 — PostgreSQL 8.1(2005年)がテーブル継承を使った擬似パーティショニングをサポート
- 2005年 — MySQL 5.1 がネイティブパーティショニングをサポート
- 2008年 — Web 2.0 時代のデータ爆発で、大規模サービスの設計に「シャーディング(アプリ層での分散)」と「DBパーティショニング」の議論が盛んになる
- 2017年 — PostgreSQL 10 が宣言的パーティショニングを実装。より直感的な構文でのパーティション管理が可能に
- 現在 — クラウドDWH(BigQuery・Redshift・Snowflake)でパーティショニングが設計の基本機能として標準化。ペタバイト級のデータを効率的に扱う要となっている
パーティショニングの効果
シャーディングとの違い
パーティショニングと混同されがちな シャーディング(Sharding) は、データを「別々のDBサーバー」に分散させる手法です。
| 観点 | パーティショニング | シャーディング |
|---|---|---|
| 分散先 | 同一DBサーバー内 | 複数のDBサーバー |
| 透過性 | アプリから1テーブルに見える | アプリ側での振り分けロジックが必要 |
| 管理 | DBMSが自動管理 | アプリ・ミドルウェアが管理 |
| スケール | 垂直方向(1台のリソース拡張) | 水平方向(台数追加) |
関連する規格・RFC
| 規格・RFC番号 | 内容 |
|---|---|
| ISO/IEC 9075 (SQL:2003) | パーティション管理のSQL構文の基礎(各DBMSが独自拡張) |