このトピックでは、パーティションテーブルの作成に使用されるCREATE TABLEステートメントの構文、句、およびパラメーター、およびcreate tableステートメントで使用できるパーティションメソッドについて説明します。 構文は、AUTOモードのデータベースにのみ適用できます。
使用上の注意
パーティションテーブルの作成に使用する構文を使用する前に、現在の論理データベースの作成時にmodeパラメーターをautoに設定してください。 値autoは自動分割モードを示します。 このパラメーターをautoに設定しない場合、構文は使用できません。
SHOW CREATE DATBASE db_name
ステートメントを実行して、現在の論理データベースのパーティショニングモードを照会できます。 例:CREATE DATABASE part_db mode='auto'; クエリOK、影響を受ける1行 (4.29秒) SHOW CREATE DATABASE part_db; + ---------- + ----------------------------------------------- + | データベース | データベースの作成 | + ---------- + ----------------------------------------------- + | part_db | CREATE DATABASE 'part_db' /* MODE = 'auto' */ | + ---------- + ----------------------------------------------- + 1行セット (0.18秒)
データベースの作成に使用される構文の詳細については、「create database」をご参照ください。
パーティションテーブルのプライマリキーにパーティションキーが含まれておらず、自動インクリメントのプライマリキーではない場合は、プライマリキーが一意であることを確認してください。
パーティションテーブルの作成時にレベル2パーティションに関連する機能が必要な場合、PolarDB-Xインスタンスのバージョンは5.4.17-16952556以降です。
構文
CREATE [PARTITION] TABLE [存在しない場合] tbl_name
(create_definition, ...)
[table_options]
[table_partition_definition]
[local_partition_definition]
create_definition:
col_name column_definition
| mysql_create_definition
| [UNIQUE] グローバルインデックス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 [=] 値
| index_type
| PARSER parser_name付き
| コメント '文字列'
index_type:
USING {BTREE | ハッシュ}
# グローバルセカンダリインデックスを作成します。
global_secondary_index_option:
[COVERING (col_name,...)]
[partition_options]
[VISIBLE | INVISIBLE]
table_options:
table_option [[,] table_option] ...
table_option: {
# パーティションテーブルが属するテーブルグループを指定します。
TABLEGROUP [=] value,...,}
# パーティションテーブルのタイプを指定します。
table_partition_definition:
シングル
| 放送
| partition_options
# パーティションを指定します。
partition_options:
partition_columns_definition
[subpartition_columns_definition]
[subpartition_specs_definition]/* テンプレート化されたレベル2パーティションを指定します。* /
partition_specs_definition
# レベル1パーティションのパーティションキー列を指定します。
partition_columns_definition:
パーティー
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)})
| リストコラム (column_list)
| CO_HASH({column_expr_list}) partitions_count
# レベル2パーティションのパーティションキー列を指定します。
subpartition_columns_definition:
サブパーティー
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)})
| リストコラム (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:
パーティションpartition_count
subpartitions_count:
サブパーツpartition_count
# パーティション関数を指定します。
partition_func:
YEAR
| TO_DAYS
| TO_MONTHS
| TO_WEEKS
| TO_SECOND
| UNIX_TIMESTAMP
| 月
| DAYOFWEEK
| DAYOFMONTH
| DAYOFYEAR
| SUBSTR
| SUBSTRING
| 右
| 左
#3種類のレベル1パーティションを指定します。
partition_specs_definition:
hash_partition_list
| range_partition_list
| list_partition_list
#3種類のレベル2パーティションを指定します。
subpartition_specs_definition:
hash_subpartition_list
| range_subpartition_list
| list_subpartition_list
# レベル1パーティションのHASHまたはKEYサブパーティションを指定します。
hash_partition_list:
/* レベル1パーティション内のすべてのサブパーティションは、HASHパーティショニングタイプです。* /
| ( hash_partition [, hash_partition, ...] )
hash_partition:
PARTITION partition_name [partition_spec_options] /* 純粋なレベル1パーティションまたはテンプレート付きサブパーティションを指定します。* /
| PARTITION partition_name subpartitions_count [subpartition_specs_definition] /* レベル1パーティションの下にテンプレート化されていないサブパーティションを指定します。* /
# レベル2パーティションのHASHまたはKEYサブパーティションを指定します。
hash_subpartition_list:
| 空
| ( hash_subpartition [, hash_subpartition, ...] )
hash_subpartition:
SUBPARTITION subpartition_name [partition_spec_options]
# レベル1パーティションのRANGEまたはRANGE COLUMNSサブパーティションを指定します。
range_partition_list:
(range_partition [, range_partition, ... ] )
range_partition:
PARTITION partition_name VALUES LESS THAN (range_bound_value) [partition_spec_options] /* 純粋なレベル1パーティションまたはテンプレートサブパーティションを指定します。* /
| PARTITION partition_name VALUES LESS THAN (range_bound_value) [[subpartitions_count] [subpartition_specs_definition]] /* レベル1パーティションの下にテンプレート化されていないサブパーティションを指定します。* /
# レベル2パーティションのRANGEまたはRANGE COLUMNSサブパーティションを指定します。
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 /* RANGEパーティションの最大数を指定します。* /
| expr /* 単一のパーティションキー列の範囲境界値を指定します。* /
| value_list /* 複数のパーティションキー列の範囲境界値を指定します。* /
# レベル1パーティションのLISTまたはLIST COLUMNSサブパーティションを指定します。
list_partition_list:
(list_partition [, list_partition ...])
list_partition:
PARTITION partition_name VALUES LESS THAN (range_bound_value) [partition_spec_options] /* 純粋なレベル1パーティションまたはテンプレートサブパーティションを指定します。* /
| PARTITION partition_name VALUES IN (list_bound_value) [[subpartitions_count] [subpartition_specs_definition]] /* レベル1パーティションの下にテンプレート化されていないサブパーティションを指定します。* /
# レベル2パーティションのLISTまたはLIST COLUMNSサブパーティションを指定します。
list_subpartition_list:
(list_subpartition [, list_subpartition ...])
list_subpartition:
SUBPARTITION subpartition_name VALUES IN (list_bound_value) [partition_spec_options]
list_bound_value:
default /* デフォルトのLISTパーティションを指定します。* /
| value_set
value_set:
value_list /* 単一のパーティションキー列の値のセットを指定します。* /
| (value_list) [, (value_list), ...] /* 複数のパーティションキー列の値のセットを指定します。* /
value_list:
value [, value, ...]
partition_spec_options:
[[ストレージ] エンジン [=] engine_name]
[COMMENT [=] 'string']
[LOCALITY [=] locality_option]
table_option:
[[ストレージ] エンジン [=] engine_name]
[COMMENT [=] 'string']
[{CHARSET | キャラクターセット} [=] 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:
RANGE (column_name) によるローカルパーティー
[STARTWITH 'yyyy-MM-dd ']
インターバルinterval_count [年 | 月 | 日]
[expire_after_countの後のEXPIRE]
[事前割り当て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,
名前varchar(30) 、
主キー (id)
) シングル;
放送テーブル
PolarDB-Xでは、BROADCASTキーワードを指定してブロードキャストテーブルを作成できます。 PolarDB-Xインスタンスにブロードキャストテーブルを作成すると、ブロードキャストテーブルはPolarDB-Xインスタンスの各データノードにレプリケートされます。 例:
CREATE TABLE broadcast_tbl (
id bigint not null auto_increment,
bid int,
名前varchar(30) 、
主キー (id)
) 放送;
パーティション分割されたテーブル
パーティション分割タイプ
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分割の違いを示しています。
パーティション分割タイプ | サポートされているパーティションキー | パーティション分割機能のサポート | 文構文 | 制限 | ルーティングポリシー (ポイントクエリ) |
KEYパーティショニング (デフォルト) | 単一列パーティションキー | 無効 | キーによるパーティション (c1) |
|
|
ベクトル分割キー | 無効 | PARTITION BY KEY(c1,c2,...,cn) |
|
| |
ハッシュ | 単一列パーティションキー | 無効 | ハッシュによるパーティー (c1) |
| PARTITION BY HASH(c1) のルーティング戦略は、PARTITION BY KEY(c1) のルーティング戦略と同じです。 |
Enabled | ハッシュによるパーティー (年 (c1)) |
| |||
ベクトル分割キー | 無効 | PARTITIONBY HASH(c1,c2,...,cn) |
|
|
例1-1:KEYパーティショニング
KEYパーティショニングは、PolarDB-Xのデフォルトのパーティショニングタイプです。 KEYパーティショニングは、ベクターパーティションキーをサポートします。 name列とid列をテーブルのパーティションキーとして使用し、パーティションの数を8に設定する場合は、次のステートメントを実行してテーブルを作成できます。
テーブルの作成key_tbl (
id bigint not null auto_increment,
bid int,
名前varchar(30) 、
birthday datetime not null,
主キー (id)
)
PARTITION BY KEY(name, id)
パーティー8;
この例では、name列とid列で構成されるベクターパーティションキーを使用して、テーブルをパーティション化します。 デフォルトでは、データはname列の値のみに基づいてパーティションにルーティングされます。 したがって、パーティションプルーニングを使用してSQLステートメントを最適化するには、SQLステートメントのWHERE句のname列のみに基づいて条件を指定する必要があります。
## 次のSQL文は、パーティションプルーニング条件を満たし、1つのパーティション内のデータのみをスキャンします。
key_tblからのSELECT id (name='Jack');
name列のデータが均等に分散されていない場合、または特定のデータに頻繁にアクセスされる場合は、ベクター内の別のパーティションキー列 (id列など) を使用して、パフォーマンスを最適化するためにパーティションを分割できます。 詳細については、「ALTER TABLEGROUP」をご参照ください。
ベクトルパーティションキーがN個のパーティションキー列で構成され、データが最初のK (1 ≦ K ≦ N) 個のパーティションキー列にルーティングされる場合、SQL文のWHERE句のベクトルパーティションキーの最初のK列のみに基づいてパーティションプルーニングの条件を指定する必要があります。
例1-2: HASHパーティショニング
id列をパーティションキーとして使用してテーブルを水平にパーティション分割し、パーティション数を8に設定する場合は、次のステートメントを実行して、HASHパーティション分割を使用してテーブルを作成できます。
テーブルの作成hash_tbl (
id bigint not null auto_increment,
bid int,
名前varchar(30) 、
birthday datetime not null,
主キー (id)
)
ハッシュ (id) によるパーティション
パーティション8;
HASHパーティショニングでは、YEARやTO_DAYSなどのパーティショニング関数を使用して、タイムスタンプを整数に変換できます。 誕生日列をテーブルのパーティションキーとして使用し、パーティション数を8に設定する場合は、次のステートメントを実行してテーブルを作成します。
テーブルの作成hash_tbl_todays (
id bigint not null auto_increment,
bid int,
名前varchar(30) 、
birthday datetime not null,
主キー (id)
)
PARTITION BY HASH(TO_DAYS(birthday))
パーティー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構文でサポートされているベクターパーティションキーを使用できるようにします。 さまざまな分割タイプの構文については、「分割タイプ」をご参照ください。 例:
テーブルの作成hash_tbl2 (
id bigint not null auto_increment,
bid int,
名前varchar(30) 、
birthday datetime not null,
主キー (id)
)
ハッシュによるパーティー (名前、誕生日)
パーティー8;
HASHパーティション分割タイプを使用してテーブルをパーティション分割する場合は、ベクターパーティションキーが使用されます。 テーブル内のデータは、すべてのパーティションキー列の値のハッシュ値に基づいてパーティションにルーティングされます。 SQL文のWHERE句のすべてのパーティションキー列に基づいて、パーティションプルーニングの条件を指定する必要があります。 以下の例では、SQL1はhash_tbl2テーブルのパーティションプルーニング条件を満たし、SQL2はhash_tbl2テーブルのパーティションプルーニング条件を満たしていません。
## 次のSQL文SQL1は、パーティションプルーニング条件を満たしています。 ステートメントが実行されると、指定されたパーティションのみがスキャンされます。
name='Jack' およびbirthday='1990-11-11' であるhash_tbl2からのSELECT id。## 次のSQL文SQL2は、パーティションプルーニング条件を満たしていません。 ステートメントが実行されると、すべてのパーティションがスキャンされます。
hash_tbl2からのSELECT id (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パーティショニングの違いを示しています。
パーティション分割タイプ | サポートされているパーティションキー | パーティション分割機能のサポート | 文構文 | 制限 | ルーティングポリシー (ポイントクエリ) |
範囲の列 | 単一列パーティションキーとベクターパーティションキー | 無効 | 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列の指定された値の範囲に基づいてパーティション分割されたテーブルを作成できます。
テーブル注文を作成する (
order_id int,
order_time datetimeがnullではない)
範囲列によるPARTITION (order_id,order_time)
(
パートp1はより少ない値 (10000、'2021-01-01 ') 、
パートp2はより少ない値 (20000、'2021-01-01 ') 、
パーティーp3はより少ない値 (30000、'2021-01-01 ') 、
パートp4はより少ない値 (40000、'2021-01-01 ') 、
パートp5はより少ない値 (50000、'2021-01-01 ') 、
PARTITION p6値未満 (MAXVALUE、MAXVALUE)
);
RANGE COLUMNSパーティショニングは、TIMESTAMPまたはTIMEデータを含むパーティションキーをサポートしていません。
例2-2: RANGEパーティショニング
RANGEパーティショニングは、単一列パーティションキーのみをサポートします。 日付と時刻の値を含む列をパーティションキーとして使用する場合は、YEAR、TO_DAYS、TO_SECONDS、MONTHなどのパーティション関数を含む式を使用して、列の日付と時刻の値を整数値に変換する必要があります。
文字列を含む列は、RANGEパーティション分割のパーティションキー列として使用できません。
たとえば、次のステートメントを実行して、order_time列の指定された範囲の値に基づいてパーティション分割されたテーブルを作成し、データを四半期ごとに異なるパーティションに格納できます。
テーブルorders_todaysを作成する (
id int,
order_time datetimeがnullではない)
レンジによるパーティー (to_days(order_time))
(
PARTITION p1未満の値 (to_days('2021-01-01 ')) 、
PARTITION p2未満の値 (to_days('2021-04-01 ')) 、
PARTITION p3はより少ない値 (to_days('2021-07-01 ')) 、
PARTITION p4はより少ない値 (to_days('2021-10-01 ')) 、
PARTITION p5 VALUES LESS THAN (to_days('2022-01-01 ')) 、
PARTITION p6値より少ない (最大値)
);
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パーティショニングの違いを示します。
パーティション分割タイプ | サポートされているパーティションキー | パーティション分割機能のサポート | 文構文 | 制限 | ルーティングポリシー (ポイントクエリ) |
リスト列 | 単一列パーティションキーとベクターパーティションキー | 無効 | リストによる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パーティションは、ベクターパーティションキーをサポートします。 たとえば、次のステートメントを実行して、国列と都市列の値に基づいてパーティション分割されたテーブルを作成できます。
テーブルorders_regionを作成する (
id int,
国varchar(64) 、
都市varchar(64) 、
order_time datetimeがnullではない)
リストコラムによるパーティー (国、都市)
(
パートp1の値 (('China','Hangzhou'), ('China','Beijing')),
パートp2の値 ((「米国」、「ニューヨーク」) 、(「米国」、「シカゴ」)) 、
PARTITION p3 VALUES IN (('Russian' 、'Moscow'))
);
LIST COLUMNSパーティションは、TIMESTAMPまたはTIMEデータを含むパーティションキーをサポートしていません。
例3-2: LISTパーティショニング
LISTパーティショニングは、単一列パーティションキーのみをサポートします。 日付と時刻の値を含む列をパーティションキー列として使用する場合は、YEAR、MONTH、DAYOFMONTH、TO_DAYS、TO_SECONDSなどのパーティション関数を使用して、パーティションキー列のタイムスタンプ値を整数に変換する必要があります。
たとえば、次のステートメントを実行して、order_time列の値に基づいてパーティション分割されたテーブルを作成し、年ごとに異なるパーティションにデータを格納できます。
テーブルのorders_yearsを作成する (
id int,
国varchar(64) 、
都市varchar(64) 、
order_time datetimeがnullではない)
リストによるパーティション (YEAR(order_time))
(
パートp1値 (1990,1991、1992,1993、1994,1995、1996,1997、1998,1999) 、
PARTITION p2の値 (2000,2001、2002,2003、2004,2005、2006,2007、2008,2009) 、
PARTITION p3の値 (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つだけ指定でき、最後のパーティションとしてのみ表示できます。
テーブルorders_regionを作成する (
id int,
国varchar(64) 、
都市varchar(64) 、
order_time datetimeがnullではない)
リストコラムによるパーティー (国、都市)
(
パートp1の値 (('China','Hangzhou'), ('China','Beijing')),
パートp2の値 ((「米国」、「ニューヨーク」) 、(「米国」、「シカゴ」)) 、
PARTITION p3 VALUES IN (('Russian' 、'Moscow')) 、
PARTITION pd値IN (デフォルト)
);
テーブルのorders_yearsを作成する (
id int,
国varchar(64) 、
都市varchar(64) 、
order_time datetimeがnullではない)
リストによるパーティション (YEAR(order_time))
(
パートp1値 (1990,1991、1992,1993、1994,1995、1996,1997、1998,1999) 、
PARTITION p2の値 (2000,2001、2002,2003、2004,2005、2006,2007、2008,2009) 、
PARTITION p3の値 (2010,2011、2012,2013、2014,2015、2016,2017、2018,2019) 、
PARTITION pd値IN (デフォルト)
);
制限
データ型の制限
整数型: 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文字で注文テーブルを分割し、同じ行の列の同等のクエリ条件を同じパーティションにルーティングする場合は、次のステートメントを実行します。
テーブルの作成t_orders (
id bigint not null auto_increment,
order_id bigint、
buyer_id bigint,
order_time datetimeがnullでない場合、
主キー (id)
)
CO_HASHによるパーティー (
RIGHT('order_id',6) /* c1列の値の最後の6文字でテーブルを分割します。*/,
RIGHT('buyer_id',6) /* c2列の値の最後の6文字でテーブルを分割します。* /
)
パーティー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モードのターゲットインスタンスのデータベース内のテーブルに対応するパーティションテーブルは、次のステートメントを使用して定義されます。
テーブル注文を作成する (
id bigint not null auto_increment,
buyer_id bigint,
order_id bigint、
...
主キー (id)
)
RANGE_HASHによるパーティー (order_id, buyer_Id,6)
パーティー8;
PolarDB-Xは、RANGE_HASH構文を対応するCOHASHパーティション定義に自動的に変換します。 たとえば、PolarDB-Xは、上記のステートメントのRANGE_HASH(order_id, buyer_Id,6) 句を次のCOHASHパーティション分割定義に自動的に変換します。
テーブル注文を作成する (
id bigint not null auto_increment,
buyer_id bigint,
order_id bigint、
...
主キー (id)
)
CO_HASHによるパーティー (
RIGHT('order_id',6) /* c1列の値の最後の6文字でテーブルを分割します。*/,
RIGHT('buyer_id',6) /* c2列の値の最後の6文字でテーブルを分割します。* /
)
パーティー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: テンプレートレベルのパーティション
/*
* LISTパーティショニングとKEYパーティショニングに基づいてテンプレート化されたサブパーティションを指定します。
* レベル1パーティションは、LIST COLUMNSパーティショニングに基づいて3つのレベル2パーティションに分割されます。
* 各レベル2パーティションは、KEYパーティション分割に基づいて4つのサブパーティションに分割されます。
* したがって、物理パーティションの総数は12です。
* /
CREATE TABLE sp_tbl_list_key_tp (
id int,
国varchar(64) 、
都市varchar(64) 、
order_time datetimeがnullでない場合、
主要なキー (id)
)
リストコラムによるパーティー (国、都市)
SUBPARTITION BY KEY(id) SUBPARTITIONS 4
(
PARTITION p1 VALUES IN (('China' 、'Hangzhou')) 、
PARTITION p2 VALUES IN (('Russian','Moscow')) 、
PARTITION pd値IN (デフォルト)
);
例5-2: テンプレート化されていないレベル2パーティション
/*
* LISTパーティショニングとKEYパーティショニングに基づいて、テンプレート化されていないサブパーティションを指定します。
* レベル1パーティションは、LIST COLUMNSパーティション分割に基づいて3つのレベル2パーティションに分割されます。
* 各レベル2パーティションは、KEYパーティション分割に基づいて1つ以上のサブパーティションに分割されます。
* 各レベル2パーティションのサブパーティションの指定数は、2、3、および4です。
* したがって、物理パーティションの総数は9です。
* /
CREATE TABLE sp_tbl_list_key_ntp (
id int,
国varchar(64) 、
都市varchar(64) 、
order_time datetimeがnullでない場合、
主要なキー (id)
)
リストコラムによるパーティー (国、都市)
SUBPARTITION BY KEY(id)
(
パートp1の値 (('China' 、'Hangzhou')) サブパート2、
パートp2の値 (('Russian' 、'Moscow')) サブパート3、
(デフォルト) 下位粒子の部分pd値4
);
デフォルトの自動パーティショニング
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,
名前varchar(30) 、
主キー (id) 、
インデックスidx_name (name)
);
SHOW CREATE TABLE
文を実行してCREATE TABLE文に関する情報を照会すると、CREATE TABLE文の標準構文が照会され、すべてのパーティション情報は返されません。
showテーブルの作成auto_part_tbl;
+ --------------- + ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +
| 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、
主要なキー ('id') 、
インデックス 'idx_name' ('name')
) エンジン=InnoDBデフォルト料金=utf8 |
+ --------------- + ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +
1行セット (0.06秒)
SHOW FULL CREATE TABLE
ステートメントを実行してCREATE TABLEステートメントに関する情報を照会すると、前のプライマリテーブルとインデックステーブルのすべてのパーティション情報が返されます。
show full create table auto_part_tbl;
+ --------------- + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +
| TABLE | テーブルの作成 |
+ --------------- + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +
| auto_part_tbl | PARTITION TABLE 'auto_part_tbl '(
'id' bigint(20) NOT NULL AUTO_INCREMENT、
'bid' int (11) DEFAULT NULL、
'name' varchar(30) DEFAULT NULL、
主要なキー ('id') 、
グローバルインデックス /* idx_name_$a870 */ 'idx_name' ('name') キーによるパーティション ('name' 、'id') パーティション16、
ローカルキー '_local_idx_name' ('name')
) エンジン=InnoDBデフォルト料金=utf8
キーによるパーティー ('id')
パーティー16
/* tablegroup = 'tg108' */ |
+ --------------- + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +
1行セット (0.03秒)
上記の実行結果は次のとおりです。
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 | サポート (パーティション関数は、このデータ型の値を含むパーティションキー列ではサポートされません。) | サポート | サポート | サポート | Supported (このデータ型を使用する列は、小数部がゼロの値のみを受け入れます) 。 | サポートなし | Supported (このデータ型を使用する列は、小数部がゼロの値のみを受け入れます) 。 |
日付と時刻 | 日付 | Supported (パーティショニング関数は、このデータ型の値を含むパーティションキー列によってサポートされます。) | サポート | サポート | サポート (パーティション関数は、このデータ型の値を含むパーティションキー列に必要です。) | サポート | サポート (パーティション関数は、このデータ型の値を含むパーティションキー列に必要です。) | サポート |
日付時刻 | Supported (パーティショニング関数は、このデータ型の値を含むパーティションキー列によってサポートされます。) | サポート | サポート | Supported (パーティショニング関数は、このデータ型の値を含むパーティションキー列によってサポートされます。) | サポート | Supported (パーティショニング関数は、このデータ型の値を含むパーティションキー列によってサポートされます。) | サポート | |
TIMESTAMP | Supported (パーティショニング関数は、このデータ型の値を含むパーティションキー列によってサポートされます。) | サポート | サポート | サポートなし | サポートなし | サポートなし | サポートなし | |
String | CHAR | Supported (パーティショニング関数は、このデータ型の値を含むパーティションキー列ではサポートされません) 。 | サポート | サポート | サポートなし | サポート | サポートなし | サポート |
VARCHAR | Supported (パーティショニング関数は、このデータ型の値を含むパーティションキー列ではサポートされません) 。 | サポート | サポート | サポートなし | サポート | サポートなし | サポート | |
Binary | BINARY | Supported (パーティショニング関数は、このデータ型の値を含むパーティションキー列ではサポートされません) 。 | サポート | サポート | サポートなし | サポートなし | サポートなし | サポートなし |
VARBINARY | Supported (パーティショニング関数は、このデータ型の値を含むパーティションキー列ではサポートされません) 。 | サポート | サポート | サポートなし | サポートなし | サポートなし | サポートなし |
パーティションキー列とルーティングポリシーのデータ型
パーティショニング中に使用されるデータルーティング戦略は、特にHASHパーティショニングおよびkeyパーティショニングでは、パーティションキー列のデータ型によって決まります。 異なるデータ型を含む列をパーティションキー列として使用する場合、データは異なるハッシュまたは比較アルゴリズムに基づいて異なる方法でパーティションにルーティングされます。 例えば、比較アルゴリズムを使用して、大文字と小文字を区別しない比較または大文字と小文字を区別しない比較のいずれかに基づいてデータをルーティングすることができる。 MySQLのデータルーティング戦略は、パーティションキー列のデータ型によっても決まります。
次の例では、tbl_intという名前のテーブルは、INT値を含むパーティションキー列に基づいて1,024パーティションに分割され、tbl_bigintという名前のテーブルは、BIGINT値を含むパーティションキー列に基づいて1,024パーティションに分割されます。 2つのテーブルのパーティションキー列のデータ型は異なります。 したがって、PolarDB-Xは、2つのテーブルで同じ値の12345678がクエリされると、データを異なるパーティションにルーティングします。
show create table tbl_int;
+ --------- + ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +
| TABLE | テーブルの作成 |
+ --------- + ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +
| tbl_int | CREATE TABLE 'tbl_int' (
'a' int (11) NOT NULL,
キー 'auto_shard_key_a '使用してBTREE ('a')
) エンジン=InnoDBデフォルト料金=utf8mb4
キーによるパーティー ('a')
パーティー1024 |
+ --------- + ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +
セットの1列 (0.02秒)
show create table tbl_bigint;
+ ------------ + ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +
| TABLE | テーブルの作成 |
+ ------------ + ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +
| tbl_bigint | CREATE TABLE 'tbl_bigint' (
'a' bigint(20) NOT NULL、
キー 'auto_shard_key_a '使用してBTREE ('a')
) エンジン=InnoDBデフォルト料金=utf8mb4
キーによるパーティー ('a')
パーティー1024 |
+ ------------ + ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +
set (0.10秒) mysql> create table if not exists tbl_bigint(a bigint not null) の1行
-> キーによるパーティション (a) パーティション1024;
クエリOK、影響を受ける0行 (28.41秒)
select * from tbl_intの説明a=12345678;
+ --------------------------------------------------------------------------------------------------- +
| ローカル実行 |
+ --------------------------------------------------------------------------------------------------- +
| LogicalView(tables="tbl_int[p260]", sql="SELECT 'a' FROM 'tbl_int' AS 'tbl_int' WHERE ('a' = ?)") |
| HitCache:false |
| ソース: PLAN_CACHE |
| TemplateId: c90af636 |
+ --------------------------------------------------------------------------------------------------- +
セットの4列 (0.45秒)
select * from tbl_bigintの説明a=12345678;
+ ------------------------------------------------------------------------------------------------------------ +
| ローカル実行 |
+ ------------------------------------------------------------------------------------------------------------ +
| LogicalView(tables="tbl_bigint[p477]", sql="SELECT 'a' FROM 'tbL_bigint' AS 'tbL_bigint' WHERE ('a' = ?)") |
| HitCache:false |
| ソース: PLAN_CACHE |
| TemplateId: 9b2fa47c |
+ ------------------------------------------------------------------------------------------------------------ +
セットの4列 (0.02秒)
パーティションキー列の大文字と小文字の区別、文字セット、および照合順序
パーティションテーブルのパーティションキー列の文字セットと照合順序によって、テーブル内のデータのルーティングに使用されるデータルーティング戦略が決まります。 例えば、文字セットおよび照合は、大文字と小文字を区別する比較が必要かどうかを決定する。 分割テーブルの照合が大文字と小文字を区別する場合、データルーティング中に、ハッシュまたは比較アルゴリズムに基づいて大文字と小文字を区別する比較が実行されます。 分割テーブルの照合が大文字と小文字を区別しない場合、データルーティング中に大文字と小文字を区別する比較は実行されません。 デフォルトでは、文字列を含むパーティションキー列は、大文字と小文字を区別する比較を必要としない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 | テーブルの作成 |
+ ---------------- + ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +
| tbl_varchar_cs | CREATE TABLE 'tbl_varchar_cs '(
'a' varchar(64) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL、
キー 'auto_shard_key_a '使用してBTREE ('a')
) エンジン=InnoDBデフォルト料金=utf8
キーによるパーティー ('a')
パーティー64 |
+ ---------------- + ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +
セットの1列 (0.07秒)
説明tbl_varchar_csからaを選択する ('AbcD');
+ ------------------------------------------------------------------------------------------------------------------------- +
| ローカル実行 |
+ ------------------------------------------------------------------------------------------------------------------------- +
| LogicalView(tables="tbl_varchar_cs[p29]", sql="SELECT 'a' FROM 'tbl_varchar_cs 'AS 'tbl_varchar_cs' WHERE ('a' IN(?)))") |
| HitCache:false |
| ソース: PLAN_CACHE |
| TemplateId: 2c49c244 |
+ ------------------------------------------------------------------------------------------------------------------------- +
セットの4列 (0.11秒)
説明tbl_varchar_csからaを選択する ('abcd');
+ ------------------------------------------------------------------------------------------------------------------------- +
| ローカル実行 |
+ ------------------------------------------------------------------------------------------------------------------------- +
| LogicalView(tables="tbl_varchar_cs[p11]", sql="SELECT 'a' FROM 'tbl_varchar_cs 'AS 'tbl_varchar_cs' WHERE ('a' IN(?)))") |
| HitCache:true |
| ソース: PLAN_CACHE |
| TemplateId: 2c49c244 |
+ ------------------------------------------------------------------------------------------------------------------------- +
セットの4列 (0.02秒)
例2
パーティションテーブルに対して大文字と小文字を区別しない方法でデータルーティングを実行する場合は、テーブルを作成するときに、パーティションテーブルの照合順序をutf8_general_ciなどの大文字と小文字を区別しない照合順序に設定します。 次のサンプル文では、tbl_varchar_ciパーティションテーブルにCHARACTER SET utf8 COLLATE utf8_general_ciを指定します。 この場合、システムは、「AbcD」および「abcd」文字列を同じパーティションにルーティングする。
show create table tbl_varchar_ci;
+ ---------------- + ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +
| TABLE | テーブルの作成 |
+ ---------------- + ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +
| tbl_varchar_ci | CREATE TABLE 'tbl_varchar_ci '(
'a' varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL、
キー 'auto_shard_key_a '使用してBTREE ('a')
) エンジン=InnoDBデフォルト料金=utf8
キーによるパーティー ('a')
パーティー64 |
+ ---------------- + ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +
セットの1列 (0.06秒)
説明tbl_varchar_ciからaを選択する ('AbcD');
+ ------------------------------------------------------------------------------------------------------------------------ +
| ローカル実行 |
+ ------------------------------------------------------------------------------------------------------------------------ +
| LogicalView(tables="tbl_varchar_ci[p4]", sql="SELECT 'a' FROM 'tbl_varchar_ci 'AS 'tbl_varchar_ci' WHERE ('a' IN(?)))") |
| HitCache:false |
| ソース: PLAN_CACHE |
| TemplateId: 5c97178e |
+ ------------------------------------------------------------------------------------------------------------------------ +
セットの4列 (0.15秒)
説明tbl_varchar_ciからaを選択する ('abcd');
+ ------------------------------------------------------------------------------------------------------------------------ +
| ローカル実行 |
+ ------------------------------------------------------------------------------------------------------------------------ +
| LogicalView(tables="tbl_varchar_ci[p4]", sql="SELECT 'a' FROM 'tbl_varchar_ci 'AS 'tbl_varchar_ci' WHERE ('a' IN(?)))") |
| HitCache:true |
| ソース: PLAN_CACHE |
| TemplateId: 5c97178e |
+ ------------------------------------------------------------------------------------------------------------------------ +
セットの4列 (0.02秒)
パーティションキー列の文字セットと照合順序の変更
パーティションテーブルのデータルーティング戦略は、テーブルのパーティションキー列のデータ型によって決まります。 パーティションキー列の文字セットと照合順序を変更すると、PolarDB-Xはパーティション上のすべてのデータを再配信します。 表のパーティションキー列の文字セットと照合順序を変更する場合は、注意して続行してください。
パーティションキー列のデータ型の切り捨てと変換
パーティションキー列の値の切り捨て
SQL文を実行してデータを照会または挿入するときに、定数式で指定されたパーティションキー値がパーティションキー列のデータ型の有効範囲を超えた場合、PolarDB-Xはパーティションキー列のデータ型に基づいて指定された値を切り捨て、切り捨てられた値を使用してルーティング戦略を計算します。
たとえば、tbl_smallintという名前のテーブルのパーティションキー列のデータ型はSMALLINTです。 有効なSMALLINT値の範囲は [-32768, 32767] です。 12745678や-12345678など、有効なSMALLINT値の範囲外の値を挿入すると、値は32767または-32768に切り捨てられます。 次の例は、パーティションキー値の切り捨て方法を示しています。
show create table tbl_smallint;
+ -------------- + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +
| TABLE | テーブルの作成 |
+ -------------- + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +
| tbl_smallint | CREATE TABLE 'tbl_smallint' (
'a' smallint (6) NOT NULL,
キー 'auto_shard_key_a '使用してBTREE ('a')
) エンジン=InnoDBデフォルト料金=utf8mb4
キーによるパーティー ('a')
パーティー128 |
+ -------------- + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +
セットの1列 (0.06秒)
sql_mode=''を設定します。クエリOK、影響を受ける0行 (0.00秒)
tbl_smallint値に挿入する (12345678) 、(-12345678);
クエリOK、影響を受ける2行 (0.07秒)
tbl_smallintから * を選択します。+ --------
| a |
+ --------
| -32768 |
| 32767 |
+ --------
セットの2列 (3.51秒)
select * from tbl_smallintの説明a=12345678;
+ ------------------------------------------------------------------------------------------------------------------ +
| ローカル実行 |
+ ------------------------------------------------------------------------------------------------------------------ +
| LogicalView(tables="tbl_smallint[p117]", sql="SELECT 'a' FROM 'tbl_smallint' AS 'tbl_smallint' WHERE ('a' = ?)") |
| HitCache:false |
| ソース: PLAN_CACHE |
| TemplateId: afb464d5 |
+ ------------------------------------------------------------------------------------------------------------------ +
セットの4列 (0.16秒)
select * from tbl_smallintの説明a=32767;
+ ------------------------------------------------------------------------------------------------------------------ +
| ローカル実行 |
+ ------------------------------------------------------------------------------------------------------------------ +
| LogicalView(tables="tbl_smallint[p117]", sql="SELECT 'a' FROM 'tbl_smallint' AS 'tbl_smallint' WHERE ('a' = ?)") |
| HitCache:true |
| ソース: PLAN_CACHE |
| TemplateId: afb464d5 |
+ ------------------------------------------------------------------------------------------------------------------ +
セットの4列 (0.03秒)
クエリ要求で有効な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パーティション | 対応 | 対応 |