パーティショニングの基本コンセプト
MySQL では 5.1 からパーティショニングがサポートされている。パーティショニングはインデックスと同様に、物理的なアクセスを最適化するための手段のひとつとなる。
インデックスは B+ ツリーなどの構造を使って目的の行を素早く見つけ出すための仕組みとなる。検索の高速化は B+ ツリーのデータ構造が持つ特性によるものであり、クエリによって取得されるデータサイズが小さい場合に特に大きな効果を発揮する。
一方、パーティショニングとは、データの内容等に基づいてデータを格納する領域を分けておくことで、検索するデータのサイズを小さくするというものとなる。大量のデータにアクセスする必要がある場合に、テーブル全体をスキャンするよりも特定のパーティションだけをスキャンするほうがアクセスする行数を大幅に減少可能となる。
このようにインデックスとパーティショニングは構造が異なるため、クエリによってアクセスされるデータの性質によって得意分野が異なる。パーティショニングとインデックスは相反するものではないため併用も可能。
以下に、あるテーブルをパーティショニングした際の構造例を示す。
上記の図では、それぞれのパーティションに B+ ツリーが存在する。この B+ ツリーはパーティション内のデータに対するインデックスであり、他のパーティションのデータは検索できない。このように個々のパーティションだけを対象にするタイプのインデックスをローカルインデックスと呼ぶ。一方、テーブル全体つまりすべてのパーティションを対象にしたインデックスをグローバルインデックスと呼ぶ。ただし、MySQL ではグローバルインデックスをサポートしていない。
パーティショニングの種類
パーティション二ングは行ごとに格納先を変更する水平パーティショニングとカラムごとに格納先を変更する垂直パーティショニングがあり、MySQL がサポートしているのは水平パーティショニングのみとなる。カラムごとに格納先を変更するタイプのものは絡むなデータベースやカラムストア型、列指向型などと呼ばれ、OLTP には向かず、おもにテーブル上の特定の列に対する集計処理などで活躍する。
水平パーティショニングでは、あるキーの値に従って、格納先のパーティションを決定する。パーティショニングで使用されるキーは、パーティションキーと呼ばれ、カラムの値を直接指定しても構わないし、関数を実行した結果であっても構わない。パーティションキーの結果に従って格納先を変えるが、MySQL にて実装されている格納方式を以下に示す。
方式 | パーティションキーの型 | 説明 |
---|---|---|
RANGE | 数値 | パーティションごとに値の範囲を指定する。パーティションキーは式で表現することができ、評価結果は数値でなければならない。例えば DATE 型から YEAR 関数などによって数値に変換する等 |
RANGE COLUMNS | 数値、DATETIME 、VARCHAR 等 | RANGE に似ているが、式を評価した結果ではなく、カラムの値そのものに基づいてパーティションを決定する。複数のカラムを指定可能であり、データ型は数値に限られない |
LIST | 数値 | パーティションごとに値のリストを指定する。RANGE と同様、パーティションキーは式の結果を利用する。式の評価結果は整数である必要がある |
LIST COLUMNS | 数値、DATETIME 、VARCHAR 等 | LIST に似ているが、カラムの値そのもおのを用いる点が異なる。RANGE COLUMNS 同様、複数のカラムを指定可能でデータ型は数値には限られない |
HASH/LINEAR HASH | 数値 | パーティションキーとパーティション数の余剰によって、格納するパーティションを決定する方式 |
KEY/LINEAR KEY | BLOB 以外 | パーティションキーから PASSWORD 関数を用いて計算した値に対し、パーティション数の余剰を計算して格納するパーティションを決定する方式 |
パーティショニングについては以下の記事がわかりやすい。
(MySQL パーティショニングまとめ)
https://qiita.com/taroshin/items/608076c9f8e09497c4b1