このトピックでは、パーティションテーブルの作成に使用されるCREATE TABLEステートメントの構文、句、およびパラメーター、およびcreate tableステートメントで使用できるパーティションメソッドについて説明します。 構文は、AUTOモードのデータベースにのみ適用できます。
使用上の注意
パーティションテーブルの作成に使用する構文を使用する前に、現在の論理データベースの作成時にmodeパラメーターをautoに設定してください。 値autoは自動分割モードを示します。 このパラメーターをautoに設定しない場合、構文は使用できません。
SHOW CREATE DATBASE db_nameステートメントを実行して、現在の論理データベースのパーティショニングモードを照会できます。 例:CREATE DATABASE part_db mode='auto'; Query OK, 1 row affected (4.29 sec) SHOW CREATE DATABASE part_db; +----------+-----------------------------------------------+ | DATABASE | CREATE DATABASE | +----------+-----------------------------------------------+ | part_db | CREATE DATABASE `part_db` /* MODE = 'auto' */ | +----------+-----------------------------------------------+ 1 row in set (0.18 sec)データベースの作成に使用される構文の詳細については、「create database」をご参照ください。
パーティションテーブルのプライマリキーにパーティションキーが含まれておらず、自動インクリメントのプライマリキーではない場合は、プライマリキーが一意であることを確認してください。
パーティションテーブルの作成時にレベル2パーティションに関連する機能が必要な場合、PolarDB-Xインスタンスのバージョンは5.4.17-16952556以降です。
構文
CREATE [PARTITION] TABLE [IF NOT EXISTS] tbl_name
(create_definition, ...)
[table_options]
[table_partition_definition]
[local_partition_definition]
create_definition:
col_name column_definition
| mysql_create_definition
| [UNIQUE] GLOBAL INDEX index_name [index_type] (index_sharding_col_name,...)
[global_secondary_index_option]
[index_option] ...
index_sharding_col_name:
col_name [(length)] [ASC | DESC]
index_option:
KEY_BLOCK_SIZE [=] value
| index_type
| WITH PARSER parser_name
| COMMENT 'string'
index_type:
USING {BTREE | HASH}
# Create a global secondary index.
global_secondary_index_option:
[COVERING (col_name,...)]
[partition_options]
[VISIBLE|INVISIBLE]
table_options:
table_option [[,] table_option] ...
table_option: {
# Specify the table group to which the partitioned table belongs.
TABLEGROUP [=] value,...,}
# Specify the type of the partitioned table.
table_partition_definition:
single
| broadcast
| partition_options
# Specify the partition.
partition_options:
partition_columns_definition
[subpartition_columns_definition]
[subpartition_specs_definition]/* Specify the templated level-2 partition.*/
partition_specs_definition
# Specify the partition key column of the level-1 partition.
partition_columns_definition:
PARTITION BY
HASH({column_name | partition_func(column_name)}) partitions_count
| KEY(column_list) partitions_count
| RANGE ({column_name | partition_func(column_name)})
| RANGE COLUMNS(column_list)
| LIST ({column_name | partition_func(column_name)})
| LIST COLUMNS(column_list)
| CO_HASH({column_expr_list}) partitions_count
# Specify the partition key column of the level-2 partition.
subpartition_columns_definition:
SUBPARTITION BY
HASH({column_name | partition_func(column_name)}) subpartitions_count
| KEY(column_list) subpartitions_count
| RANGE ({column_name | partition_func(column_name)})
| RANGE COLUMNS(column_list)
| LIST ({column_name | partition_func(column_name)})
| LIST COLUMNS(column_list)
| CO_HASH({column_expr_list}) partitions_count
column_expr_list:
{column_name | partition_func(column_name)},{column_name | partition_func(column_name)}[,{column_name | partition_func(column_name)},...]
partitions_count:
PARTITIONS partition_count
subpartitions_count:
SUBPARTITIONS partition_count
# Specify the partitioning function.
partition_func:
YEAR
| TO_DAYS
| TO_MONTHS
| TO_WEEKS
| TO_SECOND
| UNIX_TIMESTAMP
| MONTH
| DAYOFWEEK
| DAYOFMONTH
| DAYOFYEAR
| SUBSTR
| SUBSTRING
| RIGHT
| LEFT
# Specify three types of level-1 partitions.
partition_specs_definition:
hash_partition_list
| range_partition_list
| list_partition_list
# Specify three types of level-2 partitions.
subpartition_specs_definition:
hash_subpartition_list
| range_subpartition_list
| list_subpartition_list
# Specify the HASH or KEY subpartition of the level-1 partition.
hash_partition_list:
/* All subpartitions in the level-1 partition are of the HASH partitioning type.*/
| ( hash_partition [, hash_partition, ...] )
hash_partition:
PARTITION partition_name [partition_spec_options] /* Specify the pure level-1 partition or templated subpartition.*/
| PARTITION partition_name subpartitions_count [subpartition_specs_definition] /* Specify the non-templated subpartition under the level-1 partition.*/
# Specify the HASH or KEY subpartition of the level-2 partition.
hash_subpartition_list:
| empty
| ( hash_subpartition [, hash_subpartition, ...] )
hash_subpartition:
SUBPARTITION subpartition_name [partition_spec_options]
# Specify the RANGE or RANGE COLUMNS subpartition of the level-1 partition.
range_partition_list:
( range_partition [, range_partition, ... ] )
range_partition:
PARTITION partition_name VALUES LESS THAN (range_bound_value) [partition_spec_options] /* Specify the pure level-1 partition or templated subpartition.*/
| PARTITION partition_name VALUES LESS THAN (range_bound_value) [[subpartitions_count] [subpartition_specs_definition]] /* Specify the non-templated subpartition under the level-1 partition.*/
# Specify the RANGE or RANGE COLUMNS subpartition of the level-2 partition.
range_subpartition_list:
( range_subpartition [, range_subpartition, ... ] )
range_subpartition:
SUBPARTITION subpartition_name VALUES LESS THAN (range_bound_value) [partition_spec_options]
range_bound_value:
maxvalue /* Specify the maximum number of RANGE partitions.*/
| expr /* Specify the range boundary value for a single partition key column.*/
| value_list /* Specify the range boundary values for multiple partition key columns.*/
# Specify the LIST or LIST COLUMNS subpartition of the level-1 partition.
list_partition_list:
(list_partition [, list_partition ...])
list_partition:
PARTITION partition_name VALUES LESS THAN (range_bound_value) [partition_spec_options] /* Specify the pure level-1 partition or templated subpartition.*/
| PARTITION partition_name VALUES IN (list_bound_value) [[subpartitions_count] [subpartition_specs_definition]] /* Specify the non-templated subpartition under the level-1 partition.*/
# Specify the LIST or LIST COLUMNS subpartition of the level-2 partition.
list_subpartition_list:
(list_subpartition [, list_subpartition ...])
list_subpartition:
SUBPARTITION subpartition_name VALUES IN (list_bound_value) [partition_spec_options]
list_bound_value:
default /* Specify the default LIST partition.*/
| value_set
value_set:
value_list /* Specify a set of values for a single partition key column.*/
| (value_list) [, (value_list), ...] /* Specify a set of values for multiple partition key columns.*/
value_list:
value [, value, ...]
partition_spec_options:
[[STORAGE] ENGINE [=] engine_name]
[COMMENT [=] 'string']
[LOCALITY [=] locality_option]
table_option:
[[STORAGE] ENGINE [=] engine_name]
[COMMENT [=] 'string']
[{CHARSET | CHARACTER SET} [=] charset]
[COLLATE [=] collation]
[TABLEGROUP [=] table_group_id]
[LOCALITY [=] locality_option]
locality_option:
'dn=storage_inst_id_list'
storage_inst_id_list:
storage_inst_id[,storage_inst_id_list]
local_partition_definition:
LOCAL PARTITION BY RANGE (column_name)
[STARTWITH 'yyyy-MM-dd']
INTERVAL interval_count [YEAR|MONTH|DAY]
[EXPIRE AFTER expire_after_count]
[PRE ALLOCATE pre_allocate_count]
[PIVOTDATE pivotdate_func]
[DISABLE SCHEDULE]
pivotdate_func:
NOW()
| DATE_ADD(...)
| DATE_SUB(...)PolarDB-X DDLステートメントの構文は、MySQLの構文に基づいて開発されています。 上記の内容は、PolarDB-XとMySQLの構文の違いを示しています。 詳細な構文の詳細については、「MySQLドキュメント」をご参照ください。
用語
パーティションキー: テーブルが水平方向にパーティション分割される1つ以上の列。
パーティションキー列: PolarDB-Xがデータをテーブルのパーティションにルーティングする列。 パーティションキー列は、テーブルのパーティションキーの一部です。 パーティションキーには、1つ以上のパーティションキー列を含めることができます。
ベクターパーティションキー: 1つ以上のパーティションキー列を含むパーティションキー。
単一列パーティションキー: 1つのパーティションキー列のみを含むパーティションキー。
プレフィックスパーティションキー列: ベクトルパーティションキーにN個のパーティションキー列が含まれている場合、最初のK個のパーティションキー列は、ベクトルパーティションキーのプレフィックスパーティションキー列として定義されます。 Nは1より大きい数であり、Kは1以上N以下の数である。
パーティショニング関数: パーティションキー列を入力パラメーターとして使用し、どのPolarDB-Xがデータをテーブルのパーティションにルーティングするかに基づいて結果を返す関数です。
パーティションプルーニング: パーティション構成とクエリ条件に基づいてスキャンする必要のないパーティションを除外することで、クエリを最適化するために使用される機能。
ホットパーティション分割: パーティションのワークロードのバランスを取るために使用される機能。 vectorパーティションキーのプレフィックスパーティションキー列にホットデータが存在する場合、別のパーティションキー列に基づいてホットデータを複数のパーティションに分割できます。
物理パーティション: 物理テーブルシャードに対応するデータノード内のパーティション。 物理パーティションは、物理テーブルシャードに対応する。
論理パーティション: 1つ以上の物理パーティションに対応する仮想パーティション。 論理パーティションは論理概念を表す。 たとえば、レベル2パーティションを含むパーティションテーブルを作成すると、レベル2パーティションのうちのレベル1パーティションは論理パーティションになります。
パラメーター
コンポーネント | 説明 |
CHARSET | キャラクターセット | パーティション分割テーブルの列に使用される既定の文字セットを指定します。 有効な値:
|
コラート | パーティションテーブルの列に使用される既定の文字列を指定します。 有効な値:
|
TABLEGROUP | パーティションテーブルが属するテーブルグループを指定します。 このパラメーターを指定しない場合、PolarDB-Xはパーティション分割テーブルを既存のテーブルグループに自動的に割り当てるか、テーブルグループを作成します。 テーブルグループでは、すべてのテーブルを同じ分割方法で分割する必要があります。 |
ロカリティ | パーティションテーブルがデプロイされるデータノードを指定します。 |
パーティション分割されていないテーブル
PolarDB-Xを使用すると、SINGLEキーワードを指定して非パーティションテーブルを作成できます。 例:
CREATE TABLE single_tbl(
id bigint not null auto_increment,
bid int,
name varchar(30),
primary key(id)
) SINGLE;放送テーブル
PolarDB-Xでは、BROADCASTキーワードを指定してブロードキャストテーブルを作成できます。 PolarDB-Xインスタンスにブロードキャストテーブルを作成すると、ブロードキャストテーブルはPolarDB-Xインスタンスの各データノードにレプリケートされます。 例:
CREATE TABLE broadcast_tbl(
id bigint not null auto_increment,
bid int,
name varchar(30),
primary key(id)
) BROADCAST;パーティション分割されたテーブル
パーティション分割タイプ
PolarDB-Xを使用すると、パーティションの作成に使用される句の構文を設定して、ビジネス要件に合ったパーティションテーブルを作成できます。 PolarDB-Xには、次のパーティショニングタイプがあります。
HASHパーティショニング: このパーティショニングタイプは、組み込みのコンシステントハッシングを使用して、パーティショニング関数またはパーティションキー列を含む指定された式のハッシュ値を計算し、データをパーティションにルーティングします。 HASHパーティショニングタイプには、パーティショニング関数を含む式が使用されるか、パーティションキー列がパーティションキーとして使用されるかに基づいて、KEYパーティショニングとHASHパーティショニングが含まれます。
RANGEパーティショニング: このパーティショニングタイプは、指定されたパーティションキー列の値、またはパーティショニング関数を含む指定された式によって返される値を比較および計算して、データが分散される定義済みパーティションの範囲を決定し、データをパーティションにルーティングします。 RANGEパーティショニングタイプには、パーティション関数を含む式が使用されるか、パーティションキー列がパーティションキーとして使用されるかに基づいて、RANGE COLUMNSパーティショニングとRANGEパーティショニングが含まれます。
LISTパーティショニング: このパーティショニングタイプは、指定されたパーティションキー列の値、またはパーティショニング関数を含む指定された式によって返される値を比較および計算して、データが分散される定義済みパーティションの値のコレクションを決定し、データをパーティションにルーティングします。 このタイプの分割方法は、RANGE分割方法と同様である。 LISTパーティショニングタイプには、複数のパーティションキー列がパーティションキーとして使用されているかどうか、および使用方法に基づいて、LIST COLUMNSパーティショニングとLISTパーティショニングが含まれます。
COHASHパーティショニング: PolarDB-Xが提供する新しいパーティショニングタイプとして、値が類似しているさまざまなパーティションキー列に基づいてテーブルがパーティショニングされるシナリオに適しています。
HASHパーティショニング
PolarDB − XにおけるHASH区分タイプは、HASH区分およびKEY区分を含む。 HASHパーティショニングとKEYパーティショニングは、ネイティブMySQL構文でサポートされています。 PolarDB-Xは、MySQLでパーティションテーブルを作成するために使用されるHASHパーティション分割およびKEYパーティション分割の構文と構文的に互換性があり、分割、マージ、移行などの柔軟で強力なパーティション管理機能を提供し、ベクターパーティションキーでのホットパーティション分割をサポートします。 ただし、PolarDB-Xは、MySQLとは異なる方法でデータをパーティションにルーティングします。 PolarDB-Xは、HASHパーティショニングおよびKEYパーティショニングでデータルーティングを再指定します。 さまざまな分割タイプの構文の詳細については、「分割タイプ」をご参照ください。 次の表は、KEY分割とHASH分割の違いを示しています。
表 1. KEYパーティショニングとHASHパーティショニングの比較
パーティション分割タイプ | サポートされているパーティションキー | パーティション分割機能のサポート | 文構文 | 制限事項 | ルーティングポリシー (ポイントクエリ) |
KEYパーティショニング (デフォルト) | 単一列パーティションキー | Disabled | キーによるパーティション (c1) |
|
|
ベクトル分割キー | Disabled | PARTITION BY KEY(c1,c2,...,cn) |
|
| |
ハッシュ | 単一列パーティションキー | Disabled | ハッシュによるパーティー (c1) |
| PARTITION BY HASH(c1) のルーティング戦略は、PARTITION BY KEY(c1) のルーティング戦略と同じです。 |
Enabled | ハッシュによるパーティー (年 (c1)) |
| |||
ベクトル分割キー | Disabled | PARTITIONBY HASH(c1,c2,...,cn) |
|
|
例1-1:KEYパーティショニング
KEYパーティショニングは、PolarDB-Xのデフォルトのパーティショニングタイプです。 KEYパーティショニングは、ベクターパーティションキーをサポートします。 name列とid列をテーブルのパーティションキーとして使用し、パーティションの数を8に設定する場合は、次のステートメントを実行してテーブルを作成できます。
CREATE TABLE key_tbl(
id bigint not null auto_increment,
bid int,
name varchar(30),
birthday datetime not null,
primary key(id)
)
PARTITION BY KEY(name, id)
PARTITIONS 8;この例では、name列とid列で構成されるベクターパーティションキーを使用して、テーブルをパーティション化します。 デフォルトでは、データはname列の値のみに基づいてパーティションにルーティングされます。 したがって、パーティションプルーニングを使用してSQLステートメントを最適化するには、SQLステートメントのWHERE句のname列のみに基づいて条件を指定する必要があります。
## The following SQL statement meets the partition pruning condition and scans data only in one partition.
SELECT id from key_tbl where name='Jack';name列のデータが均等に分散されていない場合、または特定のデータに頻繁にアクセスされる場合は、ベクター内の別のパーティションキー列 (id列など) を使用して、パフォーマンスを最適化するためにパーティションを分割できます。 詳細については、「ALTER TABLEGROUP」をご参照ください。
ベクトルパーティションキーがN個のパーティションキー列で構成され、データが最初のK (1 ≦ K ≦ N) 個のパーティションキー列にルーティングされる場合、SQL文のWHERE句のベクトルパーティションキーの最初のK列のみに基づいてパーティションプルーニングの条件を指定する必要があります。
例1-2: HASHパーティショニング
id列をパーティションキーとして使用してテーブルを水平にパーティション分割し、パーティション数を8に設定する場合は、次のステートメントを実行して、HASHパーティション分割を使用してテーブルを作成できます。
CREATE TABLE hash_tbl(
id bigint not null auto_increment,
bid int,
name varchar(30),
birthday datetime not null,
primary key(id)
)
partition by hash(id)
partitions 8;HASHパーティショニングでは、YEARやTO_DAYSなどのパーティショニング関数を使用して、タイムスタンプを整数に変換できます。 誕生日列をテーブルのパーティションキーとして使用し、パーティション数を8に設定する場合は、次のステートメントを実行してテーブルを作成します。
CREATE TABLE hash_tbl_todays(
id bigint not null auto_increment,
bid int,
name varchar(30),
birthday datetime not null,
primary key(id)
)
PARTITION BY HASH(TO_DAYS(birthday))
PARTITIONS 8;PolarDB-Xでは、次のパーティション分割機能がサポートされています。
YEAR
MONTH
DAYOFMONTH
デイオフウィーク
DAYOFYEAR
TO_DAYS
TO_MONTHS
TO_WEEKS
TO_SECONDS
UNIX_TIMESTAMP
SUBSTR/SUBSTRING
したがって、SUBSTRまたはSUBSTRING関数のパーティションキー列のデータ型がSTRINGでなければならないことを除いて、他のパーティション関数のパーティションキー列のデータ型は、DATE、DATETIME、およびTIMESTAMPのタイプでなければなりません。
例1-3: 拡張HASHパーティショニング
PolarDB-XはHASHパーティショニングの構文を拡張し、ネイティブMySQL構文でサポートされているベクターパーティションキーを使用できるようにします。 さまざまな分割タイプの構文については、「分割タイプ」をご参照ください。 例:
CREATE TABLE hash_tbl2(
id bigint not null auto_increment,
bid int,
name varchar(30),
birthday datetime not null,
primary key(id)
)
PARTITION BY HASH(name, birthday)
PARTITIONS 8;HASHパーティション分割タイプを使用してテーブルをパーティション分割する場合は、ベクターパーティションキーが使用されます。 テーブル内のデータは、すべてのパーティションキー列の値のハッシュ値に基づいてパーティションにルーティングされます。 SQL文のWHERE句のすべてのパーティションキー列に基づいて、パーティションプルーニングの条件を指定する必要があります。 以下の例では、SQL1はhash_tbl2テーブルのパーティションプルーニング条件を満たし、SQL2はhash_tbl2テーブルのパーティションプルーニング条件を満たしていません。
## The following SQL statement SQL1 meets the partition pruning condition. When the statement is executed, only the specified partition is scanned.
SELECT id from hash_tbl2 where name='Jack' and birthday='1990-11-11';
## The following SQL statement SQL2 does not meet the partition pruning condition. When the statement is executed, all partitions are scanned.
SELECT id from hash_tbl2 where name='Jack';HASHパーティショニングでは、すべてのパーティションキー列の値のハッシュ値に基づいてデータがルーティングされます。 したがって、データは、ベクトル分割キーの特定の列のみの値のハッシュ値に基づいてデータがルーティングされるKEY分割よりも、HASH分割でより均等に分散されます。 すべてのパーティションキー列がデータパーティション分割に使用され、ホットパーティション分割に使用できるパーティションキー列がないため、HASHパーティション分割はホットパーティション分割をサポートしません。
制限事項
データ型の制限
整数型: BIGINT、BIGINT UNSINGED、INT UNSINGED、INT、MEDIUMINT、MEDIUMINT UNSINGED、SMALLINT、SMALLINT UNSINGED、TINYINT、およびTINYINT UNSINGED。
日付と時刻のタイプ: DATETIME、Date、およびTIMESTAMP。
String型: CHARおよびVARCHAR。
構文の制限
テーブルのパーティションキーが単一列パーティションキーで、パーティションキー列のデータ型がDATETIME、DATE、またはTIMESTAMPの場合、特定のパーティション分割機能がサポートされます。
テーブルのパーティションキーがベクターパーティションキーの場合、パーティション分割関数とホットパーティション分割はサポートされません。
既定では、パーティション分割テーブルには最大8,192個のパーティションを含めることができます。
デフォルトでは、パーティションキーは最大5つのパーティションキー列で構成できます。
データ分散
KEYパーティショニングとHASHパーティショニングは、組み込みのコンシステントハッシュアルゴリズムMurmurHash3に基づいて実装されます。 このアルゴリズムは業界で広くテストされており、データの衝突が少なく高性能であることが証明されています。
KEYパーティショニングまたはHASHパーティショニングを使用すると、MurmurHash3アルゴリズムに基づいて、パーティションキーの異なる値の数が3,000を超えると、異なるパーティション間のデータ分散がバランスを取ります。 パーティションキーがより多くの異なる値を含む場合、データはよりバランスのとれた方法で分散される。
レンジパーティショニング
PolarDB-XのRANGEパーティショニングタイプには、RANGEパーティショニングとRANGE COLUMNSパーティショニングが含まれます。 RANGEパーティショニングとRANGE COLUMNSパーティショニングは、ネイティブMySQL構文でサポートされています。 さまざまな分割タイプの構文の詳細については、「分割タイプ」をご参照ください。 次の表は、RANGEパーティショニングとRANGE COLUMNSパーティショニングの違いを示しています。
表 2. RANGEパーティショニングとRANGE COLUMNSパーティショニングの比較
パーティション分割タイプ | サポートされているパーティションキー | パーティション分割機能のサポート | 文構文 | 制限事項 | ルーティングポリシー (ポイントクエリ) |
範囲の列 | 単一列パーティションキーとベクターパーティションキー | Disabled | PARTITION BY RANGE COLUMNS (c1,c2,...,cn) ( PARTITION p1値が (1,10,...,1000) 未満、PARTITION p2値が (2,20,...,2000) 未満、...) | ホットパーティション分割がサポートされています。 c1パーティションキー列に88などの同じ値が含まれる行が多数ある場合、c2パーティションキー列の値に基づいてホットデータを分割できます。 |
|
範囲 | 単一列パーティションキー | Enabled | 範囲による部分 (年 (c1)) (部分p1の値がより少ない (2019) 、部分p2の値がより少ない (2021) ...) |
|
|
例2-1: RANGE COLUMNSパーティショニング
RANGE COLUMNSパーティショニングはベクターパーティションキーをサポートしますが、パーティショニング機能はサポートしません。 たとえば、次のステートメントを実行して、order_id列とorder_time列の指定された値の範囲に基づいてパーティション分割されたテーブルを作成できます。
CREATE TABLE orders(
order_id int,
order_time datetime not null)
PARTITION BY range columns(order_id,order_time)
(
PARTITION p1 VALUES LESS THAN (10000,'2021-01-01'),
PARTITION p2 VALUES LESS THAN (20000,'2021-01-01'),
PARTITION p3 VALUES LESS THAN (30000,'2021-01-01'),
PARTITION p4 VALUES LESS THAN (40000,'2021-01-01'),
PARTITION p5 VALUES LESS THAN (50000,'2021-01-01'),
PARTITION p6 VALUES LESS THAN (MAXVALUE,MAXVALUE)
);RANGE COLUMNSパーティショニングは、TIMESTAMPまたはTIMEデータを含むパーティションキーをサポートしていません。
例2-2: RANGEパーティショニング
RANGEパーティショニングは、単一列パーティションキーのみをサポートします。 日付と時刻の値を含む列をパーティションキーとして使用する場合は、YEAR、TO_DAYS、TO_SECONDS、MONTHなどのパーティション関数を含む式を使用して、列の日付と時刻の値を整数値に変換する必要があります。
文字列を含む列は、RANGEパーティション分割のパーティションキー列として使用できません。
たとえば、次のステートメントを実行して、order_time列の指定された範囲の値に基づいてパーティション分割されたテーブルを作成し、データを四半期ごとに異なるパーティションに格納できます。
CREATE TABLE orders_todays(
id int,
order_time datetime not null)
PARTITION BY RANGE(to_days(order_time))
(
PARTITION p1 VALUES LESS THAN (to_days('2021-01-01')),
PARTITION p2 VALUES LESS THAN (to_days('2021-04-01')),
PARTITION p3 VALUES LESS THAN (to_days('2021-07-01')),
PARTITION p4 VALUES LESS THAN (to_days('2021-10-01')),
PARTITION p5 VALUES LESS THAN (to_days('2022-01-01')),
PARTITION p6 VALUES LESS THAN (MAXVALUE)
);RANGEパーティショニングでは、整数値を含む列のみをパーティションキー列として使用できます。 RANGEパーティショニングでは、パーティションキーには1つのパーティションキー列のみを含めることができます。
制限事項
データ型の制限
整数型: BIGINT、BIGINT UNSINGEDINT、INT、INT UNSINGED、MEDIUMINT、MEDIUMINT UNSINGED、SMALLINT、SMALLINT UNSINGED、TINYINT、およびTINYINT UNSINGED。
日付と時刻のタイプ: DATETIMEとDate。
String型: CHARおよびVARCHAR。
構文の制限
RANGE COLUMNSパーティショニングとRANGEパーティショニングは、値の範囲の境界としてNULLをサポートしません。
RANGE COLUMNSパーティショニングでは、TIMESTAMP型の列をパーティションキー列としてサポートしていません。
RANGEパーティショニングでは、整数値を含む列のみをパーティションキー列として使用できます。 TIMESTAMP型の列をパーティションキー列として使用するには、UNIX_TIMSTAMPパーティション分割関数を使用して、タイムスタンプ値を同じタイムゾーンのタイムスタンプに変換する必要があります。
RANGEパーティショニングは、ホットパーティション分割をサポートしていません。
SQLリクエストでNULL値が指定されている場合、NULL値はデータルーティング中の最小値と見なされます。
既定では、パーティション分割テーブルには最大8,192個のパーティションを含めることができます。
デフォルトでは、パーティションキーは最大5つのパーティションキー列で構成できます。
リスト分割
PolarDB-XのLISTパーティショニングタイプには、LISTパーティショニングとLIST COLUMNSパーティショニングが含まれます。 LISTパーティショニングとLIST COLUMNSパーティショニングは、ネイティブMySQL構文でサポートされています。 さまざまなパーティショニングタイプの構文の詳細については、「パーティショニングタイプ」をご参照ください。 PolarDB-XのLISTパーティショニングとLIST COLUMNSパーティショニングもDEFAULTパーティショニングをサポートしています。 次の表に、LISTパーティショニングとLIST COLUMNSパーティショニングの違いを示します。
表 3. LISTパーティショニングとLIST COLUMNSパーティショニングの比較
パーティション分割タイプ | サポートされているパーティションキー | パーティション分割機能のサポート | 文構文 | 制限事項 | ルーティングポリシー (ポイントクエリ) |
リスト列 | 単一列パーティションキーとベクターパーティションキー | Disabled | リストによるPARTITION COLUMNS (c1,c2,...,cn) ( PARTITION p1 VALUES IN ((1,10,...,1000),(2,20,...,2000) )) 、PARTITION p2 VALUES IN (((3,30,...,3000),(3,30,...,3000) )) 、... | ホットパーティション分割はサポートされていません。 |
|
List | 単一列パーティションキー | Enabled | リストによる部分 (YEAR(c1)) (部分p1の値 (2018,2019) 、部分p2の値 (2020,2021) ...) | ホットパーティション分割はサポートされていません。 |
例3-1: LIST COLUMNSパーティショニング
LIST COLUMNSパーティションは、ベクターパーティションキーをサポートします。 たとえば、次のステートメントを実行して、国列と都市列の値に基づいてパーティション分割されたテーブルを作成できます。
CREATE TABLE orders_region(
id int,
country varchar(64),
city varchar(64),
order_time datetime not null)
PARTITION BY LIST COLUMNS(country,city)
(
PARTITION p1 VALUES IN (('China','Hangzhou'), ('China','Beijing')),
PARTITION p2 VALUES IN (('United States','NewYork'),('United States','Chicago')),
PARTITION p3 VALUES IN (('Russian','Moscow'))
);LIST COLUMNSパーティションは、TIMESTAMPまたはTIMEデータを含むパーティションキーをサポートしていません。
例3-2: LISTパーティショニング
LISTパーティショニングは、単一列パーティションキーのみをサポートします。 日付と時刻の値を含む列をパーティションキー列として使用する場合は、YEAR、MONTH、DAYOFMONTH、TO_DAYS、TO_SECONDSなどのパーティション関数を使用して、パーティションキー列のタイムスタンプ値を整数に変換する必要があります。
たとえば、次のステートメントを実行して、order_time列の値に基づいてパーティション分割されたテーブルを作成し、年ごとに異なるパーティションにデータを格納できます。
CREATE TABLE orders_years(
id int,
country varchar(64),
city varchar(64),
order_time datetime not null)
PARTITION BY LIST(YEAR(order_time))
(
PARTITION p1 VALUES IN (1990,1991,1992,1993,1994,1995,1996,1997,1998,1999),
PARTITION p2 VALUES IN (2000,2001,2002,2003,2004,2005,2006,2007,2008,2009),
PARTITION p3 VALUES IN (2010,2011,2012,2013,2014,2015,2016,2017,2018,2019)
);LISTパーティショニングでは、整数値を含む列のみをパーティションキー列として使用できます。 文字列を含む列は、パーティションキー列として使用できません。
例3-3: LIST COLUMNSパーティションまたはDEFAULTパーティションを使用したLISTパーティション
PolarDB-Xを使用すると、LIST COLUMNSパーティションまたはDEFAULTパーティションを使用したLISTパーティションを作成できます。 共通パーティションで定義されていないデータは、DEFAULTパーティションにルーティングされます。
DEFAULTパーティションは1つだけ指定でき、最後のパーティションとしてのみ表示できます。
CREATE TABLE orders_region(
id int,
country varchar(64),
city varchar(64),
order_time datetime not null)
PARTITION BY LIST COLUMNS(country,city)
(
PARTITION p1 VALUES IN (('China','Hangzhou'), ('China','Beijing')),
PARTITION p2 VALUES IN (('United States','NewYork'),('United States','Chicago')),
PARTITION p3 VALUES IN (('Russian','Moscow')),
PARTITION pd VALUES IN (DEFAULT)
);
CREATE TABLE orders_years(
id int,
country varchar(64),
city varchar(64),
order_time datetime not null)
PARTITION BY LIST(YEAR(order_time))
(
PARTITION p1 VALUES IN (1990,1991,1992,1993,1994,1995,1996,1997,1998,1999),
PARTITION p2 VALUES IN (2000,2001,2002,2003,2004,2005,2006,2007,2008,2009),
PARTITION p3 VALUES IN (2010,2011,2012,2013,2014,2015,2016,2017,2018,2019),
PARTITION pd VALUES IN (DEFAULT)
);制限事項
データ型の制限
整数型: BIGINT、BIGINT UNSINGEDINT、INT、INT UNSINGED、MEDIUMINT、MEDIUMINT UNSINGED、SMALLINT、SMALLINT UNSINGED、TINYINT、およびTINYINT UNSINGED。
日付と時刻のタイプ: DATETIMEとDate。
String型: CHARおよびVARCHAR。
構文の制限
LIST COLUMNSパーティション分割では、TIMESTAMP型の列をパーティションキー列として使用することはできません。
LISTパーティショニングでは、整数値を含む列のみをパーティションキー列として使用できます。
LIST COLUMNSパーティショニングとLISTパーティショニングは、ホットパーティション分割をサポートしていません。
既定では、パーティション分割テーブルには最大8,192個のパーティションを含めることができます。
デフォルトでは、パーティションキーは最大5つのパーティションキー列で構成できます。
COHASHパーティショニング
COHASHパーティショニングタイプは、PolarDB-X専用です。
サポートされているバージョン
インスタンスのバージョンは5.4.18-17047709以降である必要があります。
シナリオ
COHASHパーティショニングタイプは、次のシナリオに適しています。
ビジネステーブルには、1つ以上の同様の列が含まれます。 たとえば、テーブルにはc1列とc2列が含まれており、列の値の最後の4文字は常に同じです。 テーブルを列で分割し、c1列またはc2列と同等のクエリ条件をクエリに含めます。 また、条件を同じパーティションにルーティングする必要があります。
この場合、このパーティション分割タイプを使用するには、パーティション分割テーブルの異なるパーティションキー列の値の類似性を維持する必要があります。
例4-1: パーティション分割関数を使用して、COHASHパーティション分割テーブルの異なるパーティションキー列の値の類似性を定義します
注文テーブルのorder_id列とbuyer_id列が同じ行に同じ最後の6文字を含むと仮定します。 order_id列とbuyer_id列の最後の6文字で注文テーブルを分割し、同じ行の列の同等のクエリ条件を同じパーティションにルーティングする場合は、次のステートメントを実行します。
CREATE TABLE t_orders(
id bigint not null auto_increment,
order_id bigint,
buyer_id bigint,
order_time datetime not null,
primary key(id)
)
PARTITION BY CO_HASH(
RIGHT('order_id',6) /* Partition the table by the last six characters of the c1 column values.*/,
RIGHT('buyer_id',6) /* Partition the table by the last six characters of the c2 column values.*/
)
PARTITIONS 8;例4-2: RANGE_HASH構文糖を使用してPolarDB-X 1.0インスタンスをPolarDB-X 2.0インスタンスに移行する
PolarDB-X 1.0インスタンスをPolarDB-X 2.0インスタンスに移行する場合。 ソースインスタンスには、range_hashシャーディングスキーマを使用する注文テーブルがあります。 このテーブルは、DBPARTIITION by RANGE_HASH('order_id','buyer_id', 6) 構文を使用して定義されます。 この場合、AUTOモードのターゲットインスタンスのデータベース内のテーブルに対応するパーティションテーブルは、次のステートメントを使用して定義されます。
CREATE TABLE orders(
id bigint not null auto_increment,
buyer_id bigint,
order_id bigint,
...
primary key(id)
)
PARTITION BY RANGE_HASH(order_id, buyer_Id,6)
PARTITIONS 8;PolarDB-Xは、RANGE_HASH構文を対応するCOHASHパーティション定義に自動的に変換します。 たとえば、PolarDB-Xは、上記のステートメントのRANGE_HASH(order_id, buyer_Id,6) 句を次のCOHASHパーティション分割定義に自動的に変換します。
CREATE TABLE orders(
id bigint not null auto_increment,
buyer_id bigint,
order_id bigint,
...
primary key(id)
)
PARTITION BY CO_HASH(
RIGHT('order_id',6) /* Partition the table by the last six characters of the c1 column values.*/,
RIGHT('buyer_id',6) /* Partition the table by the last six characters of the c2 column values.*/
)
PARTITIONS 8;COHASHパーティショニング、HASHパーティショニング、およびKEYパーティショニングの比較
COHASH分割タイプは、HASHおよびKEY分割タイプと同様である。 次の表は、タイプを比較しています。
違い | CO_ハッシュ | キー | ハッシュ |
構文 | PARTITION BY CO_HASH(c1, c2) パーティション8 | PARTITION BY キー (c1, c2) パーティション8 | PARTITION BY HASH(c1, c2) パーティション8 |
単一列パーティションキー | 非対応 | 対応 | 対応 |
ベクトル分割キー | 対応 | 対応 | 対応 |
ベクトルパーティションキー列のパーティション関数 | サポートされています。 例: PARTITION BY CO_HASH ( /* c1列の値の最後の4文字でテーブルを分割します。* / 右 (c1, 4) 、 /* c2列の値の最後の4文字でテーブルを分割します。* / 右 (c2, 4) ) パーティション8 | 非対応 | 非対応 |
パーティションキー列の関係 | 列の値は似ています。 パーティションテーブルの異なるパーティションキー列の値の類似性を維持する必要があります。 例:
| フェデレーションインデックスのプレフィックスに似ています。 | フェデレーションインデックスのプレフィックスに似ています。 |
プレフィックス、パーティションプルーニング、および例を含むパーティションキー列の同等のクエリ | サポートされています。 例:
| サポートされています。 例:
| サポートされていません。 パーティションプルーニングは、すべてのパーティションキー列に同等の条件が含まれている場合にのみサポートされます。 例:
|
プレフィックス、パーティションプルーニング、および例のないパーティションキー列の同等のクエリ | サポートされています。 すべてのパーティションキー列の同等の条件は、パーティションプルーニングをサポートしています。 例:
| サポートされていません。 プレフィックスのないパーティションの同等の条件では、すべてのパーティションがスキャンされる必要があります。 例:
| サポートされていません。 プレフィックスのないパーティションの同等の条件では、すべてのパーティションがスキャンされる必要があります。 例:
|
範囲クエリ | サポートされていません。 すべてのパーティションがスキャンされます。 | サポートされていません。 すべてのパーティションがスキャンされます。 | サポートされていません。 すべてのパーティションがスキャンされます。 |
ルーティングポリシー (ポイントクエリ) |
| KEYパーティショニングおよびHASHパーティショニングに関する前述の内容を参照してください。 | KEYパーティショニングおよびHASHパーティショニングに関する前述の内容を参照してください。 |
ホットパーティション分割 | サポートされていません。 c1='88' などのホットキー値に対しては、さらにホットパーティション分割を実行できません。 | 対応 | 非対応 |
パーティション分割、マージ、移行などのパーティション管理 | 対応 | 対応 | 対応 |
レベル2パーティション | 対応 | 対応 | 対応 |
使用上の注意
異なるパーティションキー列の値の類似性を確認する必要があります。 パーティションテーブルはルーティング結果のみをチェックします。 COHASHパーティションテーブルのさまざまなパーティションキー列の値は、ユーザーによって類似性が維持されます。 したがって、各行のテーブルの異なるパーティションキー列の値は、同じパーティションにルーティングする必要があります。 しかしながら、異なるパーティションキー列の値の間の類似性が破壊される可能性がある。 異なるパーティションキー列の値の類似性を確認する必要があります。 PolarDB-Xはルーティング結果のみをチェックし、類似性はチェックしません。
たとえば、c1列とc2列の値の最後の4文字が同じであることを指定します。 c1=1001234およびc2=1320がシャード0にルーティングされる場合、
insert (c1,c2) 値 (100234,1320)がサポートされます。 ただし、列値の最後の4文字は異なります。
DLMステートメントを使用してパーティションキー列を変更すると、制限が課されます。 COHASHパーティションテーブルの異なるパーティションキー列の値は似ています。 したがって、誤ったデータの配布を防ぐために、DML文を使用してテーブルのパーティションキー列の値を変更する場合、PolarDB-Xは次の制限を課します。
INSERTまたはREPLCAEステートメントのvalues句の同じ行にある異なるパーティションキー列の値が異なるパーティションにルーティングされている場合、値を挿入できず、エラーが報告されます。
UPDATEステートメントまたはUPSERTステートメントのSET句を使用して複数のパーティションキー列の値を変更する場合は、すべてのパーティションキー列の値を変更する必要があります。 たとえば、c1列とc2列はパーティションキー列です。
UPDATE t1 SET c1='xx',c2='yy' WHERE id=1文を使用して、列の値を変更できます。 SET句を使用して複数のパーティションキー列の値を変更した後、列の新しい値が異なるパーティションにルーティングされた場合、UPDATEまたはUPSERTステートメントは禁止され、エラーが報告されます。COHASHパーティショニングタイプをGSIテーブルに使用した後、INSERTまたはUPDATE操作など、プライマリテーブルで実行されたすべてのDML操作により、同じ行のプライマリテーブルのGSIテーブルの異なるパーティションキー列の値が異なるパーティションにルーティングされる場合、操作も禁止され、エラーが報告されます。
COHASHパーティションテーブルのパーティションキー列のプレフィックスは0です。 COHASHパーティションテーブルの異なるパーティションキー列の値は似ています。 したがって、列は、SUBSTR、LEFT、またはRIGHTなどの分割関数によって定義される必要があります。 整数型のいくつかの桁が切り捨てられた後、プレフィックス0が生成されます。 たとえば、c1列とc2列の値の最後の4文字が同じであることを指定します。 c1=1000034およびc2=34の場合、c1列値の最後の4文字は「0034」です。 整数型を使用するCOHASHパーティションテーブルのパーティションキー列のすべての元の値が切り捨てられた後、元の値は新しい値に対応する整数に自動的に変換され、ルーティングされます。 したがって、文字列「0034」は文字列「34」に変換される。 次に、文字列「34」のハッシュが計算され、パーティションにルーティングされる。 このようにして、文字列「0034」のプレフィックスが自動的に処理されます。
パーティション分割関数の制限
右
左
SUBSTR
データ型の制限
整数型: BIGINT、BIGINT UNSINGEDINT、INT、INT UNSINGED、MEDIUMINT、MEDIUMINT UNSINGED、SMALLINT、SMALLINT UNSINGED、TINYINT、およびTINYINT UNSINGED。
固定小数点タイプ: DECIMAL。 このデータ型の小数部はゼロでなければなりません。
日付と時刻のタイプ: サポートされていません。
String型: CHARとVARCHR。
構文の制限
パーティショニング関数がパーティションキー列に使用されている場合、その列では複数のネストされたパーティショニング関数を使用できません。 例:
SUBSTR(SUBSTR(c1,-6),-4)
RANGE_HASHシンタクチックシュガーを使用する場合、最後の長さの値を負にすることはできません。
すべてのパーティションキー列の型は、次の用語で同じである必要があります。
Charsetsと照合。
長さと精度の定義。
既定では、パーティション分割テーブルには最大8,192個のパーティションを含めることができます。
デフォルトでは、パーティションキーは最大5つのパーティションキー列で構成できます。
レベル2パーティション
MySQLと同様に、PolaDB-Xでは、レベル2パーティションの構文を使用して、レベル2パーティションを含むパーティションテーブルを作成できます。 レベル2パーティションは、指定されたパーティションキー列とパーティションポリシーに基づくすべてのレベル1パーティションのサブパーティションです。
レベル2パーティションの各レベル1パーティションは、実際には1つの論理パーティションになり、レベル2パーティションのセットに対応する。
レベル2パーティションの各サブパーティションは、実際には1つの物理パーティションになり、データノード上の1つの物理テーブルシャードに対応します。
テンプレート化および非テンプレート化構文
PolarDB-Xでは、レベル2パーティションは、テンプレート付きパーティションと非テンプレート付きパーティションの2種類のパーティションに分割されます。
テンプレート化されたレベル2パーティション: 各レベル1パーティションの下のレベル2パーティションの数は、各レベル1パーティションの境界値と常に一致します。
テンプレート化されていないレベル2パーティション: 各レベル1パーティションの下のレベル2パーティションの数は、各レベル1パーティションの境界値と一致しない可能性があります。
構文の制限
レベル2パーティションを含むパーティションテーブルでは、物理パーティションの数はデフォルトで8,192を超えることはできません。
テンプレート化されていないレベル1パーティションを含むパーティションテーブルでは、各レベル2パーティションの名前は一意である必要があり、すべてのレベル1パーティションの名前と重複することはできません。
テンプレート化レベル1パーティションを含むパーティションテーブルでは、テンプレート化レベル2パーティションの名前は一意である必要があり、すべてのレベル1パーティションの名前と重複することはできません。
レベル2パーティションが使用された後、パーティションテーブル内のレベル2パーティションの数は、すべてのレベル1パーティションの下にあるレベル2パーティションの総数です。 したがって、パーティションテーブルのパーティション数は指数関数的に増加します。 過度のパーティショニング操作による悪影響や、パーティションの総数を維持できないことによるエラーを回避するために、レベル1パーティションとレベル2パーティションのシャードの数を慎重に制御することをお勧めします。
例5-1: テンプレートレベルのパーティション
/*
* Specify templated subpartitions based on LIST partitioning and KEY partitioning.
* The Level-1 partition is divided into three level-2 partitions based on LIST COLUMNS partitioning.
* Each level-2 partition is divided into four subpartitions based on KEY partitioning.
* Therefore, the total number of physical partitions is 12.
*/
CREATE TABLE sp_tbl_list_key_tp(
id int,
country varchar(64),
city varchar(64),
order_time datetime not null,
PRIMARY KEY(id)
)
PARTITION BY LIST COLUMNS(country,city)
SUBPARTITION BY KEY(id) SUBPARTITIONS 4
(
PARTITION p1 VALUES IN (('China','Hangzhou')),
PARTITION p2 VALUES IN (('Russian','Moscow')),
PARTITION pd VALUES IN (DEFAULT)
);例5-2: テンプレート化されていないレベル2パーティション
/*
* Specify non-templated subpartitions based on LIST partitioning and KEY partitioning.
* The Level-1 partition is divided into three level-2 partitions based on LIST COLUMNS partitioning.
* Each level-2 partition is divided into one or more subpartitions based on KEY partitioning.
* The specified numbers of subpartitions in each level-2 partition are 2, 3, and 4.
* Therefore, the total number of physical partitions is 9.
*/
CREATE TABLE sp_tbl_list_key_ntp(
id int,
country varchar(64),
city varchar(64),
order_time datetime not null,
PRIMARY KEY(id)
)
PARTITION BY LIST COLUMNS(country,city)
SUBPARTITION BY KEY(id)
(
PARTITION p1 VALUES IN (('China','Hangzhou')) SUBPARTITIONS 2,
PARTITION p2 VALUES IN (('Russian','Moscow')) SUBPARTITIONS 3,
PARTITION pd VALUES IN (DEFAULT) SUBPARTITIONS 4
);自動パーティショニング
デフォルトでは、自動パーティション分割はAUTOモードのデータベースでは無効になっています。 AUTOモードでデータベースの自動パーティショニングを有効にするには、次のステートメントを実行します。
SET GLOBAL AUTO_PARTITION=true;自動パーティショニングを有効にすると:
CREATE TABLEステートメントでパーティションキーを指定しない場合、PolarDB-Xはプライマリキーに基づいてkeyパーティション分割を使用してデフォルトの自動パーティション分割を実行し、レベル1のパーティション分割テーブルを作成します。 プライマリキーを指定しない場合、PolarDB-Xは暗黙のプライマリキーをパーティションキーとして使用します。
既定の自動パーティション分割方法を使用してテーブルをパーティション分割する既定のパーティションの数は、次の式を使用して計算できます。PolarDB-Xインスタンスの論理ノード数x 8。 たとえば、PolarDB-Xインスタンスの論理ノードの数が2の場合、デフォルトパーティションの数は16です。
既定では、プライマリテーブルはプライマリキーに基づいてパーティション分割され、プライマリテーブルのすべてのインデックスはインデックスキー列とプライマリキー列に基づいて自動的にパーティション分割されます。
次の例は、CREATE TABLEステートメントの標準構文を示しています。 この例では、主キー列はid列で、インデックスキー列はname列です。
CREATE TABLE auto_part_tbl(
id bigint not null auto_increment,
bid int,
name varchar(30),
primary key(id),
index idx_name (name)
);SHOW CREATE TABLE文を実行してCREATE TABLE文に関する情報を照会すると、CREATE TABLE文の標準構文が照会され、すべてのパーティション情報は返されません。
show create table auto_part_tbl;
+---------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| TABLE | CREATE TABLE |
+---------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| auto_part_tbl | CREATE TABLE `auto_part_tbl` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`bid` int(11) DEFAULT NULL,
`name` varchar(30) DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `idx_name` (`name`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8 |
+---------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.06 sec)SHOW FULL CREATE TABLEステートメントを実行してCREATE TABLEステートメントに関する情報を照会すると、前のプライマリテーブルとインデックステーブルのすべてのパーティション情報が返されます。
show full create table auto_part_tbl;
+---------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| TABLE | CREATE TABLE |
+---------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| auto_part_tbl | CREATE PARTITION TABLE `auto_part_tbl` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`bid` int(11) DEFAULT NULL,
`name` varchar(30) DEFAULT NULL,
PRIMARY KEY (`id`),
GLOBAL INDEX /* idx_name_$a870 */ `idx_name` (`name`) PARTITION BY KEY (`name`, `id`) PARTITIONS 16,
LOCAL KEY `_local_idx_name` (`name`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8
PARTITION BY KEY(`id`)
PARTITIONS 16
/* tablegroup = `tg108` */ |
+---------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.03 sec)上記の実行結果は次のとおりです。
auto_part_tblという名前のプライマリテーブルは、KEYパーティション分割を使用して、id列に基づいて16のパーティションに自動的にパーティション分割されます。
プライマリテーブルのインデックスは、グローバルインデックスであるidx_nameであり、インデックステーブルは、'name' および 'id' パーティションキー列に基づいて16のパーティションに分割されます。
手動パーティショニング
CREATE TABLEステートメントでパーティションキー列、パーティション分割関数、およびパーティション分割タイプを指定した場合、ステートメントの実行後に手動でパーティション分割されたテーブルが作成されます。 詳細については、「手動でパーティションテーブルを作成する (AUTOモード)」をご参照ください。
サポートされるデータ型
表4異なるパーティショニングタイプのパーティションキー列のデータタイプ
データ型 | HASHパーティショニング | レンジパーティショニング | リスト分割 | |||||
ハッシュ | キー | 範囲 | Range Columns | リスト | リスト列 | |||
単一パーティションキー列 | 複数のパーティションキー列 | |||||||
Integer | TINYINT |
|
|
|
|
|
|
|
TINYINT UNSIGNED |
|
|
|
|
|
|
| |
SMALLINT |
|
|
|
|
|
|
| |
SMALLINT未確認 |
|
|
|
|
|
|
| |
MEDIUMINT |
|
|
|
|
|
|
| |
MEDIUMINT UNSIGNED |
|
|
|
|
|
|
| |
INT |
|
|
|
|
|
|
| |
INT UNSIGNED |
|
|
|
|
|
|
| |
BIGINT |
|
|
|
|
|
|
| |
署名されていないBIGINT |
|
|
|
|
|
|
| |
固定小数点 | DECIMAL |
(パーティション関数は、このデータ型の値を含むパーティションキー列ではサポートされません。) |
|
|
|
|
|
|
日付と時刻 | 日付 |
|
|
|
|
|
|
|
日付時刻 |
|
|
|
|
|
|
| |
TIMESTAMP |
|
|
|
|
|
|
| |
String | CHAR |
|
|
|
|
|
|
|
VARCHAR |
|
|
|
|
|
|
| |
Binary | BINARY |
|
|
|
|
|
|
|
VARBINARY |
|
|
|
|
|
|
| |
パーティションキー列とルーティングポリシーのデータ型
パーティショニング中に使用されるデータルーティング戦略は、特にHASHパーティショニングおよびkeyパーティショニングでは、パーティションキー列のデータ型によって決まります。 異なるデータ型を含む列をパーティションキー列として使用する場合、データは異なるハッシュまたは比較アルゴリズムに基づいて異なる方法でパーティションにルーティングされます。 例えば、比較アルゴリズムを使用して、大文字と小文字を区別しない比較または大文字と小文字を区別しない比較のいずれかに基づいてデータをルーティングすることができる。 MySQLのデータルーティング戦略は、パーティションキー列のデータ型によっても決まります。
次の例では、tbl_intという名前のテーブルは、INT値を含むパーティションキー列に基づいて1,024パーティションに分割され、tbl_bigintという名前のテーブルは、BIGINT値を含むパーティションキー列に基づいて1,024パーティションに分割されます。 2つのテーブルのパーティションキー列のデータ型は異なります。 したがって、PolarDB-Xは、2つのテーブルで同じ値の12345678がクエリされると、データを異なるパーティションにルーティングします。
show create table tbl_int;
+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| TABLE | CREATE TABLE |
+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tbl_int | CREATE TABLE `tbl_int` (
`a` int(11) NOT NULL,
KEY `auto_shard_key_a` USING BTREE (`a`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4
PARTITION BY KEY(`a`)
PARTITIONS 1024 |
+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.02 sec)
show create table tbl_bigint;
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| TABLE | CREATE TABLE |
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tbl_bigint | CREATE TABLE `tbl_bigint` (
`a` bigint(20) NOT NULL,
KEY `auto_shard_key_a` USING BTREE (`a`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4
PARTITION BY KEY(`a`)
PARTITIONS 1024 |
+------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.10 sec)mysql> create table if not exists tbl_bigint(a bigint not null)
-> partition by key(a) partitions 1024;
Query OK, 0 rows affected (28.41 sec)
explain select * from tbl_int where a=12345678;
+---------------------------------------------------------------------------------------------------+
| LOGICAL EXECUTIONPLAN |
+---------------------------------------------------------------------------------------------------+
| LogicalView(tables="tbl_int[p260]", sql="SELECT `a` FROM `tbl_int` AS `tbl_int` WHERE (`a` = ?)") |
| HitCache:false |
| Source:PLAN_CACHE |
| TemplateId: c90af636 |
+---------------------------------------------------------------------------------------------------+
4 rows in set (0.45 sec)
explain select * from tbl_bigint where a=12345678;
+------------------------------------------------------------------------------------------------------------+
| LOGICAL EXECUTIONPLAN |
+------------------------------------------------------------------------------------------------------------+
| LogicalView(tables="tbl_bigint[p477]", sql="SELECT `a` FROM `tbl_bigint` AS `tbl_bigint` WHERE (`a` = ?)") |
| HitCache:false |
| Source:PLAN_CACHE |
| TemplateId: 9b2fa47c |
+------------------------------------------------------------------------------------------------------------+
4 rows in set (0.02 sec)
パーティションキー列の大文字と小文字の区別、文字セット、および照合順序
パーティションテーブルのパーティションキー列の文字セットと照合順序によって、テーブル内のデータのルーティングに使用されるデータルーティング戦略が決まります。 例えば、文字セットおよび照合は、大文字と小文字を区別する比較が必要かどうかを決定する。 分割テーブルの照合が大文字と小文字を区別する場合、データルーティング中に、ハッシュまたは比較アルゴリズムに基づいて大文字と小文字を区別する比較が実行されます。 分割テーブルの照合が大文字と小文字を区別しない場合、データルーティング中に大文字と小文字を区別する比較は実行されません。 デフォルトでは、文字列を含むパーティションキー列は、大文字と小文字を区別する比較を必要としないUTF-8文字セットとutf8_general_ci照合順序を使用します。
例 1
大文字と小文字を区別する方法でパーティションテーブルのデータルーティングを実行する場合は、テーブルを作成するときに、パーティションテーブルの照合順序をutf8_binなどの大文字と小文字を区別する照合順序に設定します。 次のサンプル文では、tbl_varchar_csパーティションテーブルにCHARACTER SET utf8 COLLATE utf8_binを指定します。 この場合、システムは、「AbcD」および「abcd」文字列をテーブルの異なるパーティションにルーティングする。
show create table tbl_varchar_cs;
+----------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| TABLE | CREATE TABLE |
+----------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tbl_varchar_cs | CREATE TABLE `tbl_varchar_cs` (
`a` varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL,
KEY `auto_shard_key_a` USING BTREE (`a`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8
PARTITION BY KEY(`a`)
PARTITIONS 64 |
+----------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.07 sec)
explain select a from tbl_varchar_cs where a in ('AbcD');
+-------------------------------------------------------------------------------------------------------------------------+
| LOGICAL EXECUTIONPLAN |
+-------------------------------------------------------------------------------------------------------------------------+
| LogicalView(tables="tbl_varchar_cs[p29]", sql="SELECT `a` FROM `tbl_varchar_cs` AS `tbl_varchar_cs` WHERE (`a` IN(?))") |
| HitCache:false |
| Source:PLAN_CACHE |
| TemplateId: 2c49c244 |
+-------------------------------------------------------------------------------------------------------------------------+
4 rows in set (0.11 sec)
explain select a from tbl_varchar_cs where a in ('abcd');
+-------------------------------------------------------------------------------------------------------------------------+
| LOGICAL EXECUTIONPLAN |
+-------------------------------------------------------------------------------------------------------------------------+
| LogicalView(tables="tbl_varchar_cs[p11]", sql="SELECT `a` FROM `tbl_varchar_cs` AS `tbl_varchar_cs` WHERE (`a` IN(?))") |
| HitCache:true |
| Source:PLAN_CACHE |
| TemplateId: 2c49c244 |
+-------------------------------------------------------------------------------------------------------------------------+
4 rows in set (0.02 sec)例 2
パーティションテーブルに対して大文字と小文字を区別しない方法でデータルーティングを実行する場合は、テーブルを作成するときに、パーティションテーブルの照合順序をutf8_general_ciなどの大文字と小文字を区別しない照合順序に設定します。 次のサンプル文では、tbl_varchar_ciパーティションテーブルにCHARACTER SET utf8 COLLATE utf8_general_ciを指定します。 この場合、システムは、「AbcD」および「abcd」文字列を同じパーティションにルーティングする。
show create table tbl_varchar_ci;
+----------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| TABLE | CREATE TABLE |
+----------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tbl_varchar_ci | CREATE TABLE `tbl_varchar_ci` (
`a` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
KEY `auto_shard_key_a` USING BTREE (`a`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8
PARTITION BY KEY(`a`)
PARTITIONS 64 |
+----------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.06 sec)
explain select a from tbl_varchar_ci where a in ('AbcD');
+------------------------------------------------------------------------------------------------------------------------+
| LOGICAL EXECUTIONPLAN |
+------------------------------------------------------------------------------------------------------------------------+
| LogicalView(tables="tbl_varchar_ci[p4]", sql="SELECT `a` FROM `tbl_varchar_ci` AS `tbl_varchar_ci` WHERE (`a` IN(?))") |
| HitCache:false |
| Source:PLAN_CACHE |
| TemplateId: 5c97178e |
+------------------------------------------------------------------------------------------------------------------------+
4 rows in set (0.15 sec)
explain select a from tbl_varchar_ci where a in ('abcd');
+------------------------------------------------------------------------------------------------------------------------+
| LOGICAL EXECUTIONPLAN |
+------------------------------------------------------------------------------------------------------------------------+
| LogicalView(tables="tbl_varchar_ci[p4]", sql="SELECT `a` FROM `tbl_varchar_ci` AS `tbl_varchar_ci` WHERE (`a` IN(?))") |
| HitCache:true |
| Source:PLAN_CACHE |
| TemplateId: 5c97178e |
+------------------------------------------------------------------------------------------------------------------------+
4 rows in set (0.02 sec)パーティションキー列の文字セットと照合順序の変更
パーティションテーブルのデータルーティング戦略は、テーブルのパーティションキー列のデータ型によって決まります。 パーティションキー列の文字セットと照合順序を変更すると、PolarDB-Xはパーティション上のすべてのデータを再配信します。 表のパーティションキー列の文字セットと照合順序を変更する場合は、注意して続行してください。
パーティションキー列のデータ型の切り捨てと変換
パーティションキー列の値の切り捨て
SQL文を実行してデータを照会または挿入するときに、定数式で指定されたパーティションキー値がパーティションキー列のデータ型の有効範囲を超えた場合、PolarDB-Xはパーティションキー列のデータ型に基づいて指定された値を切り捨て、切り捨てられた値を使用してルーティング戦略を計算します。
たとえば、tbl_smallintという名前のテーブルのパーティションキー列のデータ型はSMALLINTです。 有効なSMALLINT値の範囲は [-32768, 32767] です。 12745678や-12345678など、有効なSMALLINT値の範囲外の値を挿入すると、値は32767または-32768に切り捨てられます。 次の例は、パーティションキー値の切り捨て方法を示しています。
show create table tbl_smallint;
+--------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| TABLE | CREATE TABLE |
+--------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tbl_smallint | CREATE TABLE `tbl_smallint` (
`a` smallint(6) NOT NULL,
KEY `auto_shard_key_a` USING BTREE (`a`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4
PARTITION BY KEY(`a`)
PARTITIONS 128 |
+--------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.06 sec)
set sql_mode='';
Query OK, 0 rows affected (0.00 sec)
insert into tbl_smallint values (12345678),(-12345678);
Query OK, 2 rows affected (0.07 sec)
select * from tbl_smallint;
+--------+
| a |
+--------+
| -32768 |
| 32767 |
+--------+
2 rows in set (3.51 sec)
explain select * from tbl_smallint where a=12345678;
+------------------------------------------------------------------------------------------------------------------+
| LOGICAL EXECUTIONPLAN |
+------------------------------------------------------------------------------------------------------------------+
| LogicalView(tables="tbl_smallint[p117]", sql="SELECT `a` FROM `tbl_smallint` AS `tbl_smallint` WHERE (`a` = ?)") |
| HitCache:false |
| Source:PLAN_CACHE |
| TemplateId: afb464d5 |
+------------------------------------------------------------------------------------------------------------------+
4 rows in set (0.16 sec)
explain select * from tbl_smallint where a=32767;
+------------------------------------------------------------------------------------------------------------------+
| LOGICAL EXECUTIONPLAN |
+------------------------------------------------------------------------------------------------------------------+
| LogicalView(tables="tbl_smallint[p117]", sql="SELECT `a` FROM `tbl_smallint` AS `tbl_smallint` WHERE (`a` = ?)") |
| HitCache:true |
| Source:PLAN_CACHE |
| TemplateId: afb464d5 |
+------------------------------------------------------------------------------------------------------------------+
4 rows in set (0.03 sec)クエリ要求で有効なSMALLINT値の範囲内にないプライマリキー値を指定した場合、PolarDB-Xも値を切り捨て、切り捨てられたプライマリキー値に基づいてデータをルーティングします。 tbl_smallintテーブルでクエリを実行すると、クエリ要求でパーティションキー列の値を12345678または32767に設定すると、PolarDB-Xは同じ結果を返します。
パーティションキー列の値のデータ型の変換
SQL文を実行してデータを照会または挿入するときに、定数式で指定されたパーティションキー列のデータ型が実際の列のデータ型と異なる場合、PolarDB-Xはデータ型を暗黙的に変換し、新しいデータ型の値に基づいてルーティングを実行します。 ただし、データ型の変換が失敗する場合があります。 たとえば、abc文字列は整数に変換できません。
PolarDB-Xがパーティションキー列のデータ型を変換する場合、DQL、DML、およびDDL文に対して異なる操作が実行されます。
WHERE句のパーティションキー列のデータ型を変換するDQL文
データ型が変換されると、データは新しいデータ型に基づいてパーティションにルーティングされます。
データ型の変換に失敗した場合、パーティションキー列に基づいて指定された条件は無視され、テーブル内のすべてのデータが照会されます。
INSERTやREPLACEなどのDMLステートメント
データ型が変換されると、データは新しいデータ型に基づいてパーティションにルーティングされます。
データ型の変換に失敗した場合、エラーが返され、ステートメントは実行されません。
CREATE TABLEやALTER TABLEなどのパーティションテーブルに関連するDDLステートメント
データ型が変換された場合、DDL操作でデータ型変換がサポートされていないため、エラーが返され、ステートメントは実行されません。
データ型の変換に失敗した場合、エラーが返され、ステートメントは実行されません。
MySQLとPolarDB-XのCREATE TABLEステートメントの構文の違い
違い | MySQL | PolarDB-X |
パーティションキーに主キーを含める必要があるかどうか | 必須。 | 不要。 |
キー分割 | データは、パーティションの数によるモジュロ演算に基づいてルーティングされる。 | データは、コンシステントハッシュアルゴリズムを使用してルーティングされます。 |
HASHパーティショニング |
|
|
パーティション分割関数 | サポートされています。 PARTITION BY HASH(expr(col)) ステートメントでは、exprはYEAR(col) + 1などの一般的な式にすることができます。 | 特定の要件が満たされたときにサポートされます。 PARTITION BY HASH(expr(col)) ステートメントでは、exprは次の関数の1つだけになります。 プラス演算子 (+) 、マイナス演算子 (-) 、乗算演算子 (*) 、除算演算子 (/) などの他の演算子は、式では使用できません。
|
パーティションキー列のデータ型 | KEYパーティショニングでは、すべてのデータ型の列をパーティションキー列として使用できます。 | KEYパーティショニングでは、整数、データと時間、および文字列型の値を含む列のみをパーティションキー列として使用できます。 |
パーティションキー列の文字セット | すべての共通文字セットがサポートされています。 | 次の文字セットのみがサポートされています。
|
レベル2パーティション | 対応 | 対応 |
サポート
サポート