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

上記のパーティションテーブルの各パーティションは、さらに一定のルールに従って複数のパーティションに分割することができます。このようなパーティションテーブルをサブパーティションテーブルと呼びます。
パーティションキー
パーティションキーとは、データ行の所属するパーティションを決定するための列の集合を指します。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型でなければならず、式を使用できます。
Keyパーティション
KeyパーティションはHashパーティションと似ており、パーティションキーにHashアルゴリズムを適用して得られた整数値に対して剰余演算を行い、データがどのパーティションに属するかを決定します。
Keyパーティションには以下の特徴があります:
Keyパーティションのパーティションキーは整数型である必要はなく、TEXTとBLOBを除く他のデータ型を使用できます。
Keyパーティションのパーティションキーでは式を使用できません。
Keyパーティションのパーティションキーはベクトルをサポートします。
Keyパーティションのパーティションキーで列を指定しない場合、Keyパーティションのパーティションキーは主キーを意味します。
例:
obclient> CREATE TABLE tbl1 (col1 INT PRIMARY KEY, col2 INT) PARTITION BY KEY() PARTITIONS 5; Query OK, 0 rows affected
組み合わせパーティション
組み合わせパーティションは通常、最初に一つのパーティショニング戦略を使用し、その後のサブパーティションで別のパーティショニング戦略を使用します。業務テーブルのデータ量が非常に大きい場合に適しています。組み合わせパーティションを使用することで、さまざまなパーティショニング戦略の利点を活かすことができます。
パーティショニングに関する注意事項
MySQLモードでは、自動インクリメント列をパーティションキーとして使用する場合、以下の点に注意してください:
OceanBaseデータベースでは、自動インクリメント列の値はグローバルに一意ですが、パーティション内では増分される保証はありません。
他のパーティショニング方法と比較して、自動インクリメント列をパーティションキーとして使用するパーティションテーブルへの挿入操作は、効果的なルーティングができないため、マシントランザクションが発生し、パフォーマンスが若干低下する可能性があります。
パーティション名のルール
ListパーティションとRangeパーティションの場合、テーブル作成時にパーティション名が指定されるため、名前はその時に指定されたものになります。
Hash/Keyパーティションの場合、作成時にパーティション名を指定しなかった場合、システムが命名規則に基づいて名前を付けます。具体的には以下のとおりです:
Hash/Keyパーティションがパーティションの場合、各パーティションはそれぞれp0、p1、...、pnという名前になります。
Hash/Keyパーティションがサブパーティションの場合、各サブパーティションはそれぞれsp0、sp1、...、spnという名前になります。
テンプレートベースのサブパーティションテーブルでは、サブパーティションを定義した後、システムがサブパーティションの命名規則に基づいて名前を付けます。その命名規則は($part_name)s($subpart_name)です。非テンプレートベースのサブパーティションテーブルでは、サブパーティションの名前はユーザーが定義した名前になります。
パーティション式で使用できる関数
Range、List、Hashパーティションでは、パーティションキーに式を使用できます。OceanBaseデータベースのMySQLモードでは、パーティション式として以下の関数のみを使用できます。