データベース設計

パーティショニング ぱーてぃしょにんぐ

パーティショニングテーブル分割大規模データシャーディングパフォーマンスデータ管理
パーティショニングについて教えて

簡単に言うとこんな感じ!

パーティショニングは「巨大な倉庫を「月別の棚」に仕切る整理術」だよ!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)でパーティショニングが設計の基本機能として標準化。ペタバイト級のデータを効率的に扱う要となっている

パーティショニングの効果

パーティションプルーニングの効果(3年分のログ検索) パーティショニングなし 2024年のデータ (1億件) 2025年のデータ (1億件) 2026年のデータ (1億件) ← 検索対象 全3億件を全スキャン → 遅い・I/O負荷大 レンジパーティショニングあり 2024年パーティション (1億件) → スキップ(参照しない) 2025年パーティション (1億件) → スキップ(参照しない) 2026年パーティション (1億件) → ここだけ検索(プルーニング) 対象パーティションだけスキャン→高速!

シャーディングとの違い

パーティショニングと混同されがちな シャーディング(Sharding) は、データを「別々のDBサーバー」に分散させる手法です。

観点パーティショニングシャーディング
分散先同一DBサーバー内複数のDBサーバー
透過性アプリから1テーブルに見えるアプリ側での振り分けロジックが必要
管理DBMSが自動管理アプリ・ミドルウェアが管理
スケール垂直方向(1台のリソース拡張)水平方向(台数追加)

関連する規格・RFC

規格・RFC番号内容
ISO/IEC 9075 (SQL:2003)パーティション管理のSQL構文の基礎(各DBMSが独自拡張)

関連用語