このセクションでは、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型でなければならず、式を使用できます。
キー分区
キー分区はHash分区と似ていますが、パーティションキーにHashアルゴリズムを適用して得られた整数値に対して剰余演算を行い、データがどのパーティションに属するかを決定します。
キー分区には以下の特徴があります:
キー分区のパーティションキーは整数である必要がなく、TEXTおよびBLOB以外の他のデータ型を指定できます。
キー分区のパーティションキーでは式を使用できません。
キー分区のパーティションキーはベクトルをサポートします。
キー分区のパーティションキーで列を指定しない場合、そのパーティションの主キーを意味します。
例:
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モードでは、パーティション式として以下の関数のみを使用できます。