PolarDB-Xは自動シャーディング機能を提供します。 PolarDB-Xは、テーブルの主キーが作成された列のデータ型に基づいて、テーブルのデータをシャードします。 CREATE TABLEステートメントを変更して、シャードテーブルを作成できます。 システムは、主キーおよびインデックスキーに基づいて、シャードキーおよびシャーディングルールを自動的に選択することができる。 これにより、単一ノードのデータベースサービスが分散データベースサービスに変更されます。
前提条件
- PolarDB-XインスタンスのバージョンはV5.4.9以降です。
- データベースを作成するとき、MODEパラメーターはdrds/shardingに設定されます。 データベースの作成時にパーティション分割のモードを選択する方法の詳細については、「create database」をご参照ください。
使用上の注意
- テーブルを作成するときに、テーブルの主キーを指定する必要があります。 テーブルが作成された後、テーブルの主キーは作成できず、テーブルの主キーは削除できません。
- すべての非ローカルインデックスの名前を指定する必要があります。
- シャードテーブルのシャーディングルールを変更すると、テーブルは標準テーブルになり、シャードテーブルに使用される自動シャーディングルールとインデックス設定ルールはテーブルに適用されません。 テーブルのシャーディングルールを変更する方法の詳細については、「テーブルのタイプの変更とシャーディングルールの変更 (DRDSモード) 」をご参照ください。
構文
PARTITIONキーワードがCREATE TABLEに追加されます。 この方法では、CREATE PARTITION TABLEステートメントを使用して、主キーがシャードキーとして使用されるテーブルを作成できます。 LOCAL、GLOBAL、またはCLUSTEREDキーワードを使用して、インデックスを定義する句でインデックスのタイプを指定できます。
パーティションテーブルの作成 [存在しない場合] tbl_name
(create_definition, ...)
[table_options]
[drds_partition_options]
create_definition:
col_name column_definition
| mysql_create_definition
| [UNIQUE] [ローカル | グローバル | クラスター] INDEX index_name [index_type] (index_col_name,...)
[global_secondary_index_option]
[index_option] ...
- LOCAL: 作成するインデックスがローカルインデックスであることを指定します。
- GLOBAL: 作成するインデックスがグローバルセカンダリインデックスであることを指定します。
- CLUSTERED: 作成するインデックスがクラスター化インデックスであることを指定します。 詳細は、「クラスタインデックス」をご参照ください。
説明 CREATE TABLEステートメントの詳細については、「CREATE TABLE ( DRDSモード) 」をご参照ください。
CREATE TABLE構文を使用してシャードテーブルを作成する場合は、自動シャーディング機能を有効にするようにauto_partition変数を設定できます。 次の手順では、テーブルを作成するときに自動シャーディング機能を有効または無効にする方法について説明します。
- set @ auto_partition=1; コマンドを実行して、自動シャーディング機能を有効にします。
- CREATE TABLEステートメントを使用して、テーブルを作成します。 PARTITIONキーワードはステートメントでは必要ありません。 作成されたテーブルはシャードテーブルです。
- テーブルの作成後にテーブルをシャードしない場合は、set @ auto_partition=0; コマンドを実行して自動シャーディング機能を無効にします。
自動シャーディングルール
- テーブルにプライマリキーが指定されていない場合、PolarDB-Xはテーブルの暗黙のプライマリキーを作成し、その暗黙のプライマリキーをシャードキーとして使用します。 暗黙の主キー列は、BIGINT型のデータを含む自動インクリメントキーです。 暗黙の主キーはユーザーが表示できません。
- テーブルにプライマリキーが指定されている場合、PolarDB-Xはテーブルのプライマリキーをシャードキーとして使用します。 主キーが複数の列に作成されている場合、左側から1番目の列がシャードキーとして使用されます。
- 自動シャーディング機能はデータベースシャードのみを作成でき、シャーディングアルゴリズムは主キーのデータ型に基づいて選択されます。 この機能では、テーブルシャードは作成されません。 次の表に、さまざまなデータ型の主キーのシャーディングアルゴリズムを示します。
データ型 シャーディングアルゴリズム TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT、CHAR、またはVARCHAR HASH DATE、DATETIME、またはTIMESTAMP YYYYDD ビット、フロート、ダブル、時間、年、BLOB、ENUM、デシマル、バイナリ、テキスト、セット、またはGEOMETRY テーブルの主キーがこれらのデータ型のいずれかである場合、主キーをシャードキーとして使用することはできません。
インデックス変換ルール
- インデックスを作成するときにLOCALキーワードを指定すると、インデックスはローカルインデックスになります。
- シャードテーブルのインデックスを作成するときにLOCALキーワードを指定しない場合、カバーリング列を含まないグローバルセカンダリインデックスが作成され、インデックステーブルの左側から1番目の列がシャードキーとして使用されます。 ローカルインデックスを作成する場合は、localキーワードを指定する必要があります。
- グローバルセカンダリインデックスまたはクラスター化インデックスを作成すると、名前に
_local_
プレフィックスが含まれるローカルインデックスが自動的に作成されます。 グローバルセカンダリインデックスを削除すると、PolarDB-Xはグローバルセカンダリインデックスに対応するローカルインデックスを自動的に削除します。 - グローバルセカンダリインデックスまたはクラスタ化インデックスにシャードキーを指定しない場合、PolarDB-Xは、自動シャーディングルールに基づいて、インデックステーブルの左側から1番目の列をシャードキーとして使用します。
次のサンプルコードは、テーブルのインデックスを指定する方法を示しています。
パーティションの作成TABLE 't_order' (
'x' int、
'order_id' varchar(20) DEFAULT NULL、
'seller_id 'varchar(20) DEFAULT NULL、
LOCAL INDEX 'l_seller' using btree ('seller_id'), -- ローカルインデックスを作成します。
UNIQUE LOCAL INDEX 'l_order' using btree ('order_id') 、-- 一意のローカルインデックスを作成します。
btreeを使用したINDEX 'i_seller' ('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') 、-一意のグローバルインデックスを作成します。 インデックステーブルは、左側から最初のインデックス列に基づいて自動的にシャードされます。
btreeを使用してCLUSTERED INDEX 'c_seller' ('seller_id') 、-- クラスター化インデックスを作成します。 インデックステーブルは、左側から最初のインデックス列に基づいて自動的にシャードされます。
UNIQUE CLUSTERED INDEX 'c_order' using btree ('order_id') − 一意のクラスタ化インデックスを作成する。 インデックステーブルは、左側から最初のインデックス列に基づいて自動的にシャードされます。
);
テーブルの作成後、SHOW CREATE table t_order; ステートメントを実行して、シャードテーブルのスキーマを表示できます。
+ --------- + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +
| テーブル | テーブルの作成 |
+ --------- + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +
| t_order | パーティションの作成TABLE 't_order' (
'x' int (11) DEFAULT NULL、
'order_id' varchar(20) DEFAULT NULL、
'seller_id 'varchar(20) DEFAULT NULL、
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') 、
BTREE ('order_id') DBPARTITION BY HASH('order_id') を使用したユニークなクラスターキー 'c_order' 、
BTREE('seller_id') DBPARTITION BY HASH('seller_id') を使用したCLUSTERED INDEX 'c_seller' 、
ユニークなグローバルキー 'g_order' 使用してBTREE ('order_id') DBPARTITION BY HASH('order_id') 、
グローバルインデックス 'g_seller '使用BTREE('seller_id') DBPARTITION BY HASH('seller_id') 、
ユニークなグローバルキー 'i_order' 使用してBTREE ('order_id') DBPARTITION BY HASH('order_id') 、
グローバルインデックス 'i_seller '使用BTREE('seller_id') DBPARTITION BY HASH('seller_id')
) エンジン=InnoDBデフォルト料金セット=utf8mb4 |
+ --------- + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +
1行セット (0.06秒)
シャードテーブルで実行できるDDL文の制限と説明
次の表に、実行できるDDLステートメントと、DDL句がシャードテーブルに対して実行できる操作を示します。
DDLステートメント | 条項 | 説明 |
CREATE INDEX | なし |
|
テーブルの変更 | 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型の場合、その列で実行された操作をロールバックすることはできません。 |