このトピックでは、自動パーティショニングモードで主キーに基づいて自動的にシャードされるテーブルの自動シャーディングルールとインデックス変換ルールについて説明します。
既定では、自動パーティション分割モードでデータベースを作成するときにパーティション分割方法を指定しない場合、データベース内のテーブルは主キーに基づいてシャードされます。
前提条件
- PolarDB-Xのバージョンは5.4.13以降です。
- データベースを作成すると、MODEパラメーターはauto/partitioningに設定されます。 データベースの作成時にパーティション分割のモードを選択する方法の詳細については、「create database」をご参照ください。
使用上の注意
- テーブルを作成するときに、テーブルを単一のテーブルまたはレプリケートされたテーブルとして指定できます。 既定では、すべてのテーブルは作成時にパーティションテーブルであり、テーブルはプライマリキーに基づいてシャードされます。
- テーブルの作成時にプライマリキーに基づいて自動的にシャードされるテーブルのプライマリキーを指定する必要があります。 テーブルが作成された後、テーブルの主キーは作成できず、テーブルの主キーは削除できません。 テーブルの作成時にプライマリキーを指定しない場合、暗黙のプライマリキーが自動的に作成されます。
- 既定では、プライマリキーに基づいて自動的にシャードされるテーブルのインデックスは、最初の列が自動シャードをサポートしていないか、インデックスがローカルインデックスとして指定されていることを除いて、グローバルセカンダリインデックスです。
- プライマリキーに基づいて自動的にシャードされるテーブルのシャーディングルールを変更すると、テーブルは標準テーブルになります。 この場合、自動シャーディングルールとインデックス変換ルールはテーブルでは有効になりません。 シャーディングルールを変更する方法の詳細については、「テーブルのタイプとパーティション分割ルールの変更」をご参照ください。
- 自動パーティショニングモードを使用するデータベースでは、グローバルセカンダリインデックス (GSI) の名前はオプションであり、テーブルの作成に使用されるステートメントで一意である必要はありません。 ランダムサフィックスは、全てのGSIテーブルに割り当てられる。
show full create table
コマンドを実行して、サフィックスを表示できます。
構文
自動パーティショニングモードでは、自動シャーディングはデフォルトで有効になっています。 テーブルの作成に使用するステートメントに特定のキーワードを追加する必要はありません。 テーブルの作成に使用されるステートメントの構文の詳細については、「create table (AUTOモード) 」をご参照ください。
次の例は、自動シャーディングを使用してテーブルをシャーディングする方法を示しています。 これらの例では、show create table
を実行して、テーブルの単純なスキーマ情報を表示します。 show full create table
コマンドを実行して、テーブルの完全なスキーマ情報を表示します。
CREATE TABLE 'tb' (
-> 'x' int NOT NULL AUTO_INCREMENT、
-> 'y' int NOT NULL、
-> 'z' フロートNULLではなく、
-> 'd' int NOT NULL、
-> プライマリーキー (x、y、z、d)
-> );
クエリOK、影響を受ける0行 (0.42秒)
ショー作成テーブルtb;
+ ------- + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +
| TABLE | テーブルの作成 |
+ ------- + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +
| tb | CREATE TABLE 'tb' (
'x' int (11) NOT NULL AUTO_INCREMENT、
'y' int (11) NOT NULL,
'z' float NOT NULL,
'd' int (11) NOT NULL,
主要なキー ('x' 、'y' 、'z' 、'd') 、
ローカルキー 'auto_shard_key_x_y_d '使用するBTREE ('x' 、'y' 、'd')
) エンジン=InnoDBデフォルト料金セット=utf8mb4 |
+ ------- + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +
セットの1列 (0.01秒)
ショーフル作成テーブルtb;
+ ------- + ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +
| TABLE | テーブルの作成 |
+ ------- + ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +
| tb | パーティションテーブル 'tb' を作成する (
'x' int (11) NOT NULL AUTO_INCREMENT、
'y' int (11) NOT NULL,
'z' float NOT NULL,
'd' int (11) NOT NULL,
主要なキー ('x' 、'y' 、'z' 、'd') 、
ローカルキー 'auto_shard_key_x_y_d '使用するBTREE ('x' 、'y' 、'd')
) エンジン=InnoDBデフォルト料金=utf8mb4
キーによるパーティー ('x' 、'y' 、'd')
パーティー16
/* tablegroup = 'tg8' */ |
+ ------- + ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +
セットの1列 (0.00秒)
CREATE TABLE 't_order' (
-> 'x' int NOT NULL AUTO_INCREMENT PRIMARYキー、
-> 'order_id' varchar(20) DEFAULT NULL、
-> 'seller_id' varchar(20) デフォルトNULL、
-> インデックス ('seller_id') 、
-> ユニークなインデックス ('order_id')
-> );
クエリOK、影響を受ける0行 (0.84秒)
show create table 't_order';
+ --------- + -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +
| TABLE | テーブルの作成 |
+ --------- + -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +
| t_order | CREATE TABLE 't_order' (
'x' int (11) NOT NULL AUTO_INCREMENT、
'order_id' varchar(20) DEFAULT NULL、
'seller_id 'varchar(20) DEFAULT NULL、
主要なキー ('x') 、
インデックス 'i_0 ' ('seller_id') 、
UNIQUE INDEX 'i_1' ('order_id')
) エンジン=InnoDBデフォルト料金セット=utf8mb4 |
+ --------- + -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +
セットの1列 (0.01秒)
show full create table 't_order ';
+ --------- + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +
| TABLE | テーブルの作成 |
+ --------- + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +
| t_order | パーティションの作成TABLE 't_order' (
'x' int (11) NOT NULL AUTO_INCREMENT、
'order_id' varchar(20) DEFAULT NULL、
'seller_id 'varchar(20) DEFAULT NULL、
主要なキー ('x') 、
グローバルインデックス /* i_0_$cff4 */ 'i_0 ' ('seller_id') キーによるパーティー ('seller_id' 、'x') パーティー16、
UNIQUEグローバルインデックス /* i_1_$1782 */ 'i_1 ' ('order_id') キーによるパーティー ('order_id') パーティー16、
UNIQUEローカルキー '_local_i_1' ('order_id') 、
ローカルキー '_local_i_0' ('seller_id')
) エンジン=InnoDBデフォルト料金=utf8mb4
キーによるパーティー ('x')
パーティー16
/* tablegroup = 'tg8' */ |
+ --------- + --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +
1行セット (0.00秒)
自動シャーディングルール
- シャードするテーブルがプライマリキーで構成されていない場合、PolarDB-Xは暗黙のプライマリキーをシャードキーとして使用します。 シャードキーはBIGINT自動インクリメント主キーであり、ユーザーには見えません。
show full create table
を実行して、シャーディングの詳細を表示できます。 - シャードするテーブルにプライマリキーが指定されている場合、PolarDB-Xはテーブルのプライマリキーをシャードキーとして使用します。 シャードするテーブルに複合キーが指定されている場合、複合キーのすべての列がシャードキーとして使用されます。
- 複合キーと、キーごとにデータを順番に分割するためのパラメータが指定されているとします。 列のデータ型がサポートされていない場合、列はスキップされます。 最初の列のデータ型がサポートされていない場合、エラーが報告されます。 この場合、テーブルを単一のテーブルとして手動で指定する必要があります。 単一のテーブルを作成するために使用されるステートメントの詳細については、「非パーティションテーブル」をご参照ください。
- 自動シャーディングは、パーティションテーブルに基づくシャーディングアルゴリズムを使用します。 システムは、プライマリキーのデータ型に基づいてシャーディングアルゴリズムを自動的に選択します。
主キーデータ型 | シャーディングアルゴリズム |
bit, float, double, time, year, tinyblob, blob, mediumblob, longblob, enum, decimal, binary, varbinary, tinytext, text, mediumtext, longtext, set, geometry | 非対応 |
その他のデータ型 | キー分割 |
インデックス変換ルール
プライマリキーに基づいて自動的にシャードされるテーブルのインデックスをローカルインデックスとして指定できます。 デフォルトでは、テーブルのインデックスはグローバルセカンダリインデックスです。 インデックス型を変換するには、次のルールを使用します。
- インデックスを作成するときにLOCALキーワードを指定すると、インデックスはローカルインデックスになります。
- プライマリキーに基づいて自動的にシャードされるテーブルのインデックスを作成するときにLOCALキーワードを指定しない場合、前のセクションで説明した自動シャードルールに基づいて、カバーに基づくグローバルなセカンダリインデックスが作成され、シャードされます。 ローカルインデックスを作成する場合は、localキーワードを指定する必要があります。
- グローバルセカンダリインデックスに対してシャーディングアルゴリズムが生成されると、すべてのインデックスキーがシャーディングに使用されます。 同時に、プライマリキーは非UNIQUE制約シナリオのシャーディングアルゴリズムパラメータとして使用されます。
- グローバルセカンダリインデックスまたはクラスター化インデックスを作成すると、_local_プレフィックスを含む名前のローカルインデックスが自動的に作成されます。 グローバルセカンダリインデックスを削除すると、PolarDB-Xはグローバルセカンダリインデックスに対応するローカルインデックスを自動的に削除します。
- グローバルセカンダリインデックスまたはクラスタ化インデックスにシャードキーを指定しない場合、PolarDB-Xは、自動シャーディングルールに基づいてインデックスキーをシャードキーとして使用します。
次のサンプルコードは、テーブルのインデックスを指定する方法を示しています。
CREATE PARTITION table't_order' (
-> 'x' int、
-> 'order_id' varchar(20) DEFAULT NULL、
-> 'seller_id' varchar(20) デフォルトNULL、
-> ローカルインデックス 'l_seller' using btree ('seller_id'), -- ローカルインデックスを作成します。
-> UNIQUE LOCAL INDEX 'l_order' using btree ('order_id') 、-- 一意のローカルインデックスを作成します。
-> INDEX 'i_seller' using btree ('seller_id') 、-- グローバルなセカンダリインデックスを作成します。 インデックステーブルは自動的にシャードされます。
-> UNIQUE INDEX 'i_order' using btree ('order_id'), -- 一意のグローバル二次インデックスを作成します。 インデックステーブルは自動的にシャードされます。
-> グローバルインデックス 'g_seller' using btree ('seller_id') 、-- グローバルインデックスを作成します。 インデックステーブルは自動的にシャードされます。
-> UNIQUE GLOBAL INDEX 'g_order' using btree ('order_id') 、-- 一意のグローバルインデックスを作成します。 インデックステーブルは自動的にシャードされます。
-> CLUSTERED INDEX 'c_seller' using btree ('seller_id'), -- クラスタ化インデックスを作成します。 インデックステーブルは自動的にシャードされます。
-> UNIQUE CLUSTERED INDEX btreeを使用して 'c_order' ('order_id') -- 一意のクラスタ化インデックスを作成します。 インデックステーブルは自動的にシャードされます。
-> );
クエリOK、影響を受ける0行 (1.49秒)
show create table 't_order';
+ --------- + ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +
| TABLE | テーブルの作成 |
+ --------- + ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +
| t_order | CREATE TABLE 't_order' (
'x' int (11) DEFAULT NULL、
'order_id' varchar(20) DEFAULT NULL、
'seller_id 'varchar(20) DEFAULT NULL、
BTREE ('order_id ') を使用したユニークなCLUSTEREDインデックス 'c_order' 、
BTREEを使用したCLUSTERRED INDEX 'c_seller '('seller_id') 、
BTREE ('order_id ') を使用したUNIQUE INDEX 'g_order' 、
BTREEを使用したインデックス 'g_seller '('seller_id') 、
UNIQUE INDEX 'i_order '('order_id') を使用して、
INDEX 'i_seller 'USING BTREE ('seller_id') 、
BTREE ('order_id ') を使用したユニークなローカルキー 'l_order' 、
BTREEを使用したローカルキー 'l_seller' ('seller_id')
) エンジン=InnoDBデフォルト料金セット=utf8mb4 |
+ --------- + ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +
セットの1列 (0.01秒)
show full create table 't_order ';
+ --------- + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +
| TABLE | テーブルの作成 |
+ --------- + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +
| t_order | パーティションの作成TABLE 't_order' (
'x' int (11) DEFAULT NULL、
'order_id' varchar(20) DEFAULT NULL、
'seller_id 'varchar(20) DEFAULT NULL、
'_drds_implicit_id_' bigint(20) NOT NULL AUTO_INCREMENT、
PRIMARY KEY ('_drds_implicit_id_') 、
UNIQUE CLUSTERED INDEX /* c_order_$1ba0 */ 'c_order '使用してBTREE ('order_id') PARTITION BY KEY ('order_id ') PARTITIONS 16、
CLUSTERED INDEX /* c_seller_$1e39 */ 'c_seller '('seller_id') キーによるパーティー ('seller_id '、'_drds_implicit_id_') パーティー16、
UNIQUE GLOBAL INDEX /* g_order_$d57f */ 'g_order '使用してBTREE ('order_id') PARTITION BY KEY ('order_id ') PARTITIONS 16、
グローバルインデックス /* g_seller_$6ed5 */ 'g_seller '使用してBTREE ('seller_id') キーによるパーティー ('seller_id' 、'_drds_implicit_id_') パーティー16、
UNIQUE GLOBAL INDEX /* i_order_$ab2f */ 'i_order '使用してBTREE ('order_id') PARTITION BY KEY ('order_id') PARTITIONS 16、
グローバルインデックス /* i_seller_$2b4b */ 'i_seller '使用してBTREE ('seller_id') キーによるパーティー ('seller_id' 、'_drds_implicit_id_') パーティー16、
BTREE ('order_id ') を使用したユニークなローカルキー 'l_order' 、
UNIQUEローカルキー '_local_i_order' 使用するBTREE ('order_id ') 、
UNIQUEローカルキー '_local_g_order' 使用するBTREE ('order_id') 、
UNIQUEローカルキー '_local_c_order' 使用するBTREE ('order_id') 、
BTREE ('seller_id') を使用したローカルキー 'l_seller' 、
ローカルキー '_local_i_seller' 使用してBTREE ('seller_id') 、
ローカルキー '_local_g_seller' 使用してBTREE ('seller_id') 、
ローカルキー '_local_c_seller' 使用してBTREE ('seller_id')
) エンジン=InnoDBデフォルト料金=utf8mb4
PARTITION BY KEY('_drds_implicit_id_')
パーティー16
/* tablegroup = 'tg11' */ |
+ --------- + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +
1行セット (0.01秒)
プライマリキーに基づいて自動的にシャードされるテーブルで実行できるDDLステートメントの制限と説明
次の表に、実行できるDDLステートメントと、DDL句がシャードテーブルに対して実行できる操作を示します。
DDLステートメント | 条項 | 説明 |
CREATE INDEX | N/A |
|
テーブルの変更 | ADD {INDEX | KEY} [index_name] [index_type] (key_part,...) [index_option] ... | |
ADD [COLUMN] (col_name column_definition,...) |
| |
ドロップ [コラム] col_name | この句を使用して、テーブルの主キーまたはシャードキー、インデックステーブルのシャードキー、または複合インデックスの一意の列を削除することはできません。 | |
CHANGE [COLUMN] old_col_name new_col_name column_definition [FIRST | AFTER col_name] |
| |
MODIFY [COLUMN] col_name column_definition [FIRST | AFTER col_name] | ||
ALTER TABLE tbl_name ALTER [COLUMN] col_name { SET DEFAULT {literal | (expr)} | DROP DEFAULT} | この句を使用して、列のデフォルト値を指定または削除できます。 操作をロールバックできます。 説明 指定された列のデータがCURRENT_TIMESTAMP型の場合、その列で実行された操作をロールバックすることはできません。 |