【ぱーてぃしょにんぐ】

パーティショニング とは?

💡 大きなテーブルを「内部的に区画分けして」効率化する技術
📌 このページのポイント
パーティショニングの種類 大きなテーブル レンジ (日付で分割) 2024年1月〜3月 2024年4月〜6月 2024年7月〜9月 2024年10月〜12月 リスト (地域で分割) 東京, 大阪, 名古屋 福岡, 広島, 仙台 札幌, 那覇, 新潟 ハッシュ (ハッシュ値で分割) hash(id) % 3 P0 id=3 id=6 id=9 P1 id=1 id=4 id=7 P2 id=2 id=5 id=8
パーティショニングの種類
ひよこ ひよこ

パーティショニングってどういうときに使うの?

ペンギン先生 ペンギン先生

テーブルが数千万〜数億行になると、インデックスだけでは検索が遅くなる。例えば「3年分の注文データがあるけど、ほとんどのクエリは直近3ヶ月しか見ない」なら月別パーティションにすれば、関係ない月のデータは見なくて済むから劇的に速くなる。

ひよこ ひよこ

シャーディングとは何が違うの?

ペンギン先生 ペンギン先生

パーティショニングは1台のデータベースサーバー内部でテーブルを分割する。シャーディングは複数のデータベースサーバーにデータを分散する。パーティショニングはアプリからは1つのテーブルに見えるから透過的に使える。シャーディングはアプリ側でどのサーバーにアクセスするか意識する必要がある(ミドルウェアで隠蔽する場合もあるけど)。

ひよこ ひよこ

RANGE・LIST・HASHってどう使い分けるの?

ペンギン先生 ペンギン先生

RANGEは「日付や数値の範囲」で分割する最も一般的なパターン。月別・年別のログや注文データに使う。LISTは「特定の値」で分割する。地域コードや国コードごとに分けたいとき。HASHはキーのハッシュ値で均等に分散する。特定の条件でクエリしないけど、とにかくデータを均等に分けたいときに使うよ。

ひよこ ひよこ

パーティショニングすればいつでも速くなるの?

ペンギン先生 ペンギン先生

パーティションキーをWHERE句に含まないクエリだと全パーティションをスキャンするから、逆に遅くなることもある。「パーティションプルーニング」が効くかどうかがポイントで、これはパーティションキーで絞り込むクエリかどうかで決まる。あとパーティション間をまたぐJOINやUNIQUE制約にも制限がある。設計をミスると「パーティショニングしたのに全然速くならない、むしろ制約が増えて面倒」という事態になりがちで、導入前に実際のクエリパターンを分析するのが重要なんだ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
パーティショニングって出てきたら「巨大テーブルを条件ごとに内部分割して検索や管理を効率化する仕組み」と思えばだいたいOK!
📖 おまけ:英語の意味
「Partitioning」 = 分割すること
💬 Partition(区画・仕切り)から。テーブルを仕切って区画分けするイメージ
← 用語集にもどる