この記事では、OceanBaseデータベースのパーティションとその種類について説明します。
パーティションの紹介
OceanBaseデータベースでは、通常のテーブルのデータを一定のルールに基づいて異なるブロックに分割し、同一ブロック内のデータを物理的にまとめて格納することができます。このようにブロックに分割されたテーブルをパーティションテーブルと呼び、その各ブロックをパーティションと呼びます。OceanBaseデータベースのMySQLモードでは、単一のテーブルでサポートされる最大パーティション数はテナントレベルの構成パラメータmax_partition_numによって制御され、デフォルトは8192個です。
以下の図のように、1つのテーブルが5つのパーティションに分割され、2台のマシンに分散しています:

上記のパーティションテーブルの各パーティションは、さらに一定のルールに基づいて複数のパーティションに細分化することも可能であり、このようなパーティションテーブルをセカンダリパーティションテーブルと呼びます。
説明
OBShardingツールとセカンダリテーブルパーティションを組み合わせることで、5レベルのテーブルパーティショニング機能を実現できます。
パーティションキー
パーティションキーとは、データ行が属するパーティションを決定するための列の集合を指します。OceanBaseデータベースのMySQLモードでは、その定義に以下のルールに従う必要があります:
- テーブルに主キーが存在する場合、パーティションキーは主キーの部分集合である必要があります。
- テーブルに主キーは存在しないが一意キーが存在する場合、パーティションキーは一意キーの部分集合である必要があります。
- テーブルに主キーおよび一意キーの両方が存在しない場合、パーティションキーは任意の列の組み合わせとすることができ、主キーおよび一意キーの制限を受けません。
パーティション式
パーティション式とは、パーティションキーに基づいて構築された計算ロジックであり、データ行を具体的なパーティションにマッピングするために使用されます。
パーティションの種類
OceanBaseデータベースのMySQLモードは、現在以下のパーティションタイプをサポートしています:
Rangeパーティション
Range Columnsパーティション
Listパーティション
List Columnsパーティション
Hashパーティション
Keyパーティション
コンポジット・パーティション
Rangeパーティション
Rangeパーティションは、パーティションテーブルの定義時に各パーティションに設定されたパーティションキー値の範囲に基づいて、データを対応するパーティションにマッピングします。これは一般的なパーティショニングタイプであり、日付型と組み合わせて使用されることが多いです。例えば、業務ログテーブルを日/週/月ごとにパーティション分割することができます。
Rangeパーティションのパーティションキーは整数型またはYEAR型でなければなりません。他の日付型フィールドをパーティション分割する場合は、関数を使用して変換する必要があります。Rangeパーティションのパーティションキーは1列のみサポートしています。
Range Columnsパーティション
Range ColumnsパーティションはRangeパーティションと基本的に同じ機能を持ちますが、以下の点で異なります:
Range Columnsパーティションのパーティションキーの結果は整数型である必要はなく、以下のデータ型を使用できます:
TINYINT、SMALLINT、MEDIUMINT、INT(INTEGER)、BIGINTを含むすべての整数型がサポートされています。DOUBLE、FLOAT、DECIMALデータ型を含む浮動小数点型がサポートされています。具体的な型は以下の通りです:DECIMAL、DECIMAL[(M[,D])]DEC、NUMERIC、FIXEDFLOAT[(M,D)]、FLOAT(p)DOUBLE、DOUBLE[(M,D)]DOUBLE PRECISION、REAL
日付型の
DATE、DATETIME、TIMESTAMPがサポートされています。日付や時間に関連する他のデータ型の列をパーティションキーとして使用することはサポートされていません。
文字列型のCHAR、VARCHAR、BINARY、VARBINARYがサポートされています。
TEXTまたはBLOBデータ型の列をパーティションキーとして使用することはサポートされていません。
Range Columnsパーティションのパーティションキーには式を使用できません。
Range Columnsパーティションのパーティションキーには複数の列(つまりカラムベクトル)を指定できます。
Listパーティション
Listパーティションでは、レコード行をどのようにパーティションにマッピングするかを明示的に制御できます。具体的には、各パーティションのパーティションキーに対して一連の離散値リストを指定します。これはRangeパーティションやHashパーティションとは異なります。Listパーティションの利点は、無秩序または無関係なデータセットを容易にパーティション分割できることです。
Listパーティションのパーティションキーは列名でも式でも構いませんが、パーティションキーは整数型またはYEAR型でなければなりません。
List Columnsパーティション
List ColumnsパーティションはListパーティションと基本的に同じ機能を持ちますが、以下の点で異なります:
List Columnsパーティションのパーティションキーは整数型である必要はなく、以下のデータ型を使用できます:
TINYINT、SMALLINT、MEDIUMINT、INT (INTEGER)、BIGINTを含むすべての整数型がサポートされています。
DECIMALやFLOATなどの他の数値データ型の列をパーティションキーとして使用することはサポートされていません。
日付型のDATEとDATETIMEがサポートされています。
日付や時間に関連する他のデータ型の列をパーティションキーとして使用することはサポートされていません。
文字列型のCHAR、VARCHAR、BINARY、VARBINARYがサポートされています。
TEXTまたはBLOBデータ型の列をパーティションキーとして使用することはサポートされていません。
List Columnsパーティションのパーティションキーには式を使用できません。
List Columnsパーティションは複数のパーティションキーをサポートしていますが、Listパーティションは単一のパーティションキーしかサポートしていません。
Hashパーティション
Hashパーティションは、RangeパーティションやListパーティションの方法でパーティション分割できない場合に適しており、その実装方法はシンプルで、パーティションキー上のHash関数の値に基づいてレコードを異なるパーティションにハッシュ分散します。次のような特徴を持つデータの場合、Hashパーティションを使用するのが良い選択です:
データのパーティションキーのリスト特性を指定できない場合。
異なる範囲内のデータサイズに大きな差があり、手動でのバランス調整が困難な場合。
Rangeパーティションを使用した後にデータの集中が深刻な場合。
パラレルDML、パーティションプルーニング、パーティション結合などのパフォーマンスが非常に重要な場合。
Hashパーティションのパーティションキーは整数型またはYEAR型でなければならず、式を使用することも可能です。
キー・パーティション
キー・パーティションはHashパーティションと似ており、パーティションキーにHashアルゴリズムを適用して得られる整数値に対して剰余演算を行い、データがどのパーティションに属するかを決定します。
キー・パーティションには以下の特徴があります:
キー・パーティションのパーティションキーは整数型である必要はなく、TEXTやBLOB以外の他のデータ型を使用できます。
キー・パーティションのパーティションキーには式を使用できません。
キー・パーティションのパーティションキーにはベクトルを使用できます。
キー・パーティションのパーティションキーに列を指定しない場合、そのパーティションキーは主キーを意味します。
例:
obclient> CREATE TABLE tbl1 (col1 INT PRIMARY KEY, col2 INT) PARTITION BY KEY() PARTITIONS 5;
コンポジット・パーティション
コンポジット・パーティションは通常、最初に一つのパーティショニング戦略を使用し、その後サブパーティションで別のパーティショニング戦略を使用するもので、業務テーブルのデータ量が非常に大きい場合に適しています。コンポジット・パーティションを使用することで、複数のパーティショニング戦略の利点を活用できます。
パーティションに関する注意事項
MySQLモードでは、自動インクリメント列をパーティションキーとして使用する際には、以下の点に注意する必要があります:
OceanBaseデータベースでは、自動インクリメント列の値はグローバルに一意ですが、パーティション内では増加するとは限りません。
他のパーティショニング方式と比較して、自動インクリメント列をパーティションキーとして使用するパーティションテーブルへの挿入操作は、効果的なルーティングができないため、マシン間トランザクションが発生し、パフォーマンスが若干低下します。
パーティション名のルール
ListパーティションとRangeパーティションについては、テーブル作成時にパーティション名が指定されるため、その名前は作成時に指定したものとなります。
Hash/Keyパーティションについては、作成時にパーティション名が指定されていない場合、システムが命名規則に基づいてパーティション名を決定します。具体的には以下のようになります:
Hash/Keyパーティションが1次パーティションの場合、各パーティションはそれぞれp0、p1、…、pnという名前で命名されます。
Hash/Keyパーティションが2次パーティションの場合、各パーティションはそれぞれsp0、sp1、…、spnという名前で命名されます。
テンプレート化された2次パーティションテーブルでは、2次パーティションを定義した後、システムが2次パーティションの命名規則に基づいてパーティション名を決定します。その命名規則は($part_name)s($subpart_name)です。テンプレート化されていない2次パーティションテーブルでは、2次パーティションの名前はユーザーが定義した名前となります。
パーティション式で使用できる関数
Rangeパーティション、Listパーティション、Hashパーティションにおいては、パーティションキーとして式を使用できます。OceanBaseデータベースのMySQLモードでは、パーティション式として以下の関数のみが使用可能です。