自動パーティショニングモードでデータベースを作成すると、PolarDB-X はデフォルトでプライマリキーによってテーブルをシャーディングします。パーティショニングキーワードは不要です。これにより、標準の CREATE TABLE 構文を使用でき、PolarDB-X がシャードキーとシャーディングアルゴリズムを自動的に選択します。
このトピックでは、プライマリキーによって自動的にシャーディングされるテーブルの自動シャーディングルール、インデックス変換ルール、および DDL 制約について説明します。
前提条件
開始する前に、以下を確認してください。
PolarDB-X のバージョンが 5.4.13 以降であること
データベースが
MODE = autoまたはMODE = partitioningで作成されていること (詳細については、「CREATE DATABASE」をご参照ください)。
自動シャーディングの仕組み
PolarDB-X は、自動的にシャーディングされるテーブルに KEY パーティショニングを使用します。テーブル作成時、システムはプライマリキー列を検査し、サポートされていないデータの型の列をスキップし、残りの列をシャードキーとして使用します。追加の構成は不要です。
シャードキーの選択
| プライマリキーのタイプ | 使用されるシャードキー |
|---|---|
| プライマリキーなし | 暗黙のプライマリキー (_drds_implicit_id_):ユーザーには非表示の BIGINT 自動インクリメント列です。表示するには show full create table を実行します。 |
| 単一列プライマリキー | プライマリキー列 |
| 複合プライマリキー | 複合キー内のすべての列 (サポートされていないデータの型の列はスキップされます) |
サポートされているデータの型
PolarDB-X は、サポートされているデータの型を持つ列にのみ KEY パーティショニングを適用します。列がサポートされていない型の場合、システムはシャードキーを構築する際にその列をスキップします。
サポートされている型 (KEY パーティショニング):
整数型 (tinyint、smallint、mediumint、int、bigint、およびそれらの符号なしバリアント)、date、datetime、timestamp、char、varchar
サポートされていない型 (自動シャーディングの対象外):
bit、float、double、time、year、tinyblob、blob、mediumblob、longblob、enum、decimal、binary、varbinary、tinytext、text、mediumtext、longtext、set、geometry
複合キーの動作: 複合キー内の列がサポートされていない型の場合、PolarDB-X はその列をスキップします。複合キーの最初の列がサポートされていない型の場合、エラーが報告されます。代わりに、手動でテーブルを単一テーブルとして作成する必要があります。詳細については、「非パーティション化テーブルとブロードキャストテーブルの作成」をご参照ください。
注意事項
必要に応じて、テーブル作成時にテーブルを単一テーブルまたはレプリケートされたテーブルとして指定します。すべてのテーブルは、デフォルトでプライマリキーによってシャーディングされるパーティションテーブルになります。
テーブルを作成する際は、プライマリキーを指定してください。作成後、プライマリキーを追加または削除することはできません。
プライマリキーが指定されていない場合、PolarDB-X は暗黙のプライマリキー (
_drds_implicit_id_) を自動的に作成します。シャーディングの詳細を表示するには、show full create tableを実行します。自動的にシャーディングされるテーブルのインデックスは、最初の列のデータの型がサポートされていない場合、または
LOCALを明示的に指定しない限り、デフォルトでグローバルセカンダリインデックス (GSI) になります。自動パーティショニングモードでの GSI 名はオプションであり、
CREATE TABLE文で一意である必要はありません。PolarDB-X は、すべての GSI テーブルにランダムなサフィックスを割り当てます。表示するにはshow full create tableを実行します。自動的にシャーディングされたテーブルのシャーディングルールを変更すると、そのテーブルは標準テーブルになります。自動シャーディングおよびインデックス変換ルールは適用されなくなります。詳細については、「テーブルのタイプを変更し、パーティショニングルールを修正する」をご参照ください。
構文と例
自動シャーディングはデフォルトで有効になっています。テーブル作成時に特別なキーワードは不要です。完全な CREATE TABLE 構文については、「CREATE TABLE」をご参照ください。
簡略化されたスキーマを表示するには show create table を使用し、パーティションの詳細を含む完全なスキーマを表示するには show full create table を使用します。
例 1:複合プライマリキー
テーブル tb には複合プライマリキー (x, y, z, d) があります。z が float (サポートされていない型) であるため、PolarDB-X は x、y、および d をシャードキーとして使用します。
CREATE TABLE `tb` (
`x` int NOT NULL AUTO_INCREMENT,
`y` int NOT NULL,
`z` float NOT NULL,
`d` int NOT NULL,
PRIMARY KEY (x,y,z,d)
);
Query OK, 0 rows affected (0.42 sec)show create table tb;
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| TABLE | CREATE 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,
PRIMARY KEY (`x`, `y`, `z`, `d`),
LOCAL KEY `auto_shard_key_x_y_d` USING BTREE (`x`, `y`, `d`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 |
+-------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)
show full create table tb;
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| TABLE | CREATE TABLE |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| tb | CREATE PARTITION TABLE `tb` (
`x` int(11) NOT NULL AUTO_INCREMENT,
`y` int(11) NOT NULL,
`z` float NOT NULL,
`d` int(11) NOT NULL,
PRIMARY KEY (`x`, `y`, `z`, `d`),
LOCAL KEY `auto_shard_key_x_y_d` USING BTREE (`x`, `y`, `d`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4
PARTITION BY KEY(`x`,`y`,`d`)
PARTITIONS 16
/* tablegroup = `tg8` */ |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)例 2:インデックスを持つ単一プライマリキー
テーブル t_order には、単一の int プライマリキー x があります。PolarDB-X は x でシャーディングし、両方のインデックスを自動的に GSI に変換します。
CREATE TABLE `t_order` (
`x` int NOT NULL AUTO_INCREMENT PRIMARY KEY,
`order_id` varchar(20) DEFAULT NULL,
`seller_id` varchar(20) DEFAULT NULL,
INDEX (`seller_id`),
UNIQUE INDEX (`order_id`)
);
Query OK, 0 rows affected (0.84 sec)show create table `t_order`;
+---------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| TABLE | CREATE 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,
PRIMARY KEY (`x`),
INDEX `i_0` (`seller_id`),
UNIQUE INDEX `i_1` (`order_id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 |
+---------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)
show full create table `t_order`;
+---------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| TABLE | CREATE TABLE |
+---------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| t_order | CREATE PARTITION TABLE `t_order` (
`x` int(11) NOT NULL AUTO_INCREMENT,
`order_id` varchar(20) DEFAULT NULL,
`seller_id` varchar(20) DEFAULT NULL,
PRIMARY KEY (`x`),
GLOBAL INDEX /* i_0_$cff4 */ `i_0` (`seller_id`) PARTITION BY KEY (`seller_id`, `x`) PARTITIONS 16,
UNIQUE GLOBAL INDEX /* i_1_$1782 */ `i_1` (`order_id`) PARTITION BY KEY (`order_id`) PARTITIONS 16,
UNIQUE LOCAL KEY `_local_i_1` (`order_id`),
LOCAL KEY `_local_i_0` (`seller_id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4
PARTITION BY KEY(`x`)
PARTITIONS 16
/* tablegroup = `tg8` */ |
+---------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)インデックス変換ルール
デフォルトでは、自動的にシャーディングされるテーブルのインデックスは GSI になります。代わりにローカルインデックスを作成するには、LOCAL を明示的に指定します。
コアルール: LOCAL を指定しない限り、インデックスはデフォルトで GSI になります。
| 使用されるキーワード | 実際に作成されるインデックス |
|---|---|
[UNIQUE] LOCAL INDEX | ローカルインデックス |
[UNIQUE] INDEX(タイプ未指定) | GSI(自動シャーディングルールに基づくシャーディング対応) |
[UNIQUE] GLOBAL INDEX | GSI |
[UNIQUE] CLUSTERED INDEX | クラスタ化 GSI |
追加ルール:
PolarDB-X が GSI のシャーディングアルゴリズムを生成する場合、すべてのインデックスキー列を使用します。
UNIQUEではないインデックスの場合、プライマリキーもシャーディングパラメーターとして含まれます。GSI またはクラスター化インデックスにシャードキーが指定されていない場合、PolarDB-X はインデックスキーに自動シャーディングルールを適用します。
GSI またはクラスター化インデックスを作成すると、
_local_でプレフィックスされた対応するローカルインデックスも自動的に作成されます。GSI を削除すると、関連するローカルインデックスも自動的に削除されます。
次の例では、サポートされているすべてのインデックスタイプを持つテーブルを作成します。
CREATE PARTITION 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`), -- Local index
UNIQUE LOCAL INDEX `l_order` using btree (`order_id`), -- Unique local index
INDEX `i_seller` using btree (`seller_id`), -- GSI (auto-sharded)
UNIQUE INDEX `i_order` using btree (`order_id`), -- Unique GSI (auto-sharded)
GLOBAL INDEX `g_seller` using btree (`seller_id`), -- GSI (auto-sharded)
UNIQUE GLOBAL INDEX `g_order` using btree (`order_id`), -- Unique GSI (auto-sharded)
CLUSTERED INDEX `c_seller` using btree (`seller_id`), -- Clustered GSI (auto-sharded)
UNIQUE CLUSTERED INDEX `c_order` using btree (`order_id`) -- Unique clustered GSI (auto-sharded)
);
Query OK, 0 rows affected (1.49 sec)
show create table `t_order`;
+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| TABLE | CREATE TABLE |
+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| t_order | CREATE TABLE `t_order` (
`x` int(11) DEFAULT NULL,
`order_id` varchar(20) DEFAULT NULL,
`seller_id` varchar(20) DEFAULT NULL,
UNIQUE CLUSTERED INDEX `c_order` USING BTREE (`order_id`),
CLUSTERED INDEX `c_seller` USING BTREE (`seller_id`),
UNIQUE INDEX `g_order` USING BTREE (`order_id`),
INDEX `g_seller` USING BTREE (`seller_id`),
UNIQUE INDEX `i_order` USING BTREE (`order_id`),
INDEX `i_seller` USING BTREE (`seller_id`),
UNIQUE LOCAL KEY `l_order` USING BTREE (`order_id`),
LOCAL KEY `l_seller` USING BTREE (`seller_id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 |
+---------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)
show full create table `t_order`;
+---------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| TABLE | CREATE TABLE |
+---------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| t_order | CREATE PARTITION 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` USING BTREE (`order_id`) PARTITION BY KEY (`order_id`) PARTITIONS 16,
CLUSTERED INDEX /* c_seller_$1e39 */ `c_seller` USING BTREE (`seller_id`) PARTITION BY KEY (`seller_id`, `_drds_implicit_id_`) PARTITIONS 16,
UNIQUE GLOBAL INDEX /* g_order_$d57f */ `g_order` USING BTREE (`order_id`) PARTITION BY KEY (`order_id`) PARTITIONS 16,
GLOBAL INDEX /* g_seller_$6ed5 */ `g_seller` USING BTREE (`seller_id`) PARTITION BY KEY (`seller_id`, `_drds_implicit_id_`) PARTITIONS 16,
UNIQUE GLOBAL INDEX /* i_order_$ab2f */ `i_order` USING BTREE (`order_id`) PARTITION BY KEY (`order_id`) PARTITIONS 16,
GLOBAL INDEX /* i_seller_$2b4b */ `i_seller` USING BTREE (`seller_id`) PARTITION BY KEY (`seller_id`, `_drds_implicit_id_`) PARTITIONS 16,
UNIQUE LOCAL KEY `l_order` USING BTREE (`order_id`),
UNIQUE LOCAL KEY `_local_i_order` USING BTREE (`order_id`),
UNIQUE LOCAL KEY `_local_g_order` USING BTREE (`order_id`),
UNIQUE LOCAL KEY `_local_c_order` USING BTREE (`order_id`),
LOCAL KEY `l_seller` USING BTREE (`seller_id`),
LOCAL KEY `_local_i_seller` USING BTREE (`seller_id`),
LOCAL KEY `_local_g_seller` USING BTREE (`seller_id`),
LOCAL KEY `_local_c_seller` USING BTREE (`seller_id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4
PARTITION BY KEY(`_drds_implicit_id_`)
PARTITIONS 16
/* tablegroup = `tg11` */ |
+---------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)DDL 制約
自動的にシャーディングされるテーブルの DDL 操作には、次の制約が適用されます。
CREATE INDEX
| 句 | 動作 |
|---|---|
[UNIQUE] LOCAL INDEX | ローカルインデックスを作成し、テーブルのクラスター化インデックスに追加します。 |
[UNIQUE] INDEX | GSI と、対応する _local_ プレフィックス付きローカルインデックスを作成し、両方をクラスター化インデックスに追加します。シャードキーが指定されていない場合、自動シャーディングルールが適用されます。 |
[UNIQUE] GLOBAL INDEX または [UNIQUE] CLUSTERED INDEX | GSI またはクラスター化インデックスと、クラスター化インデックスに追加される _local_ プレフィックス付きローカルインデックスを作成します。シャードキーが指定されていない場合、自動シャーディングルールが適用されます。 |
ALTER TABLE
| 句 | 制約 |
|---|---|
ADD {INDEX | KEY} | CREATE INDEX と同じ変換ルールが適用されます。 |
ADD [COLUMN] | 新しい列は、すべてのクラスター化 GSI および一意のクラスター化 GSI に自動的に追加されます。ロールバックがサポートされています。 |
DROP [COLUMN] | プライマリキー、テーブルのシャードキー、インデックステーブルのシャードキー、または複合インデックスの一意の列を削除することはできません。 |
CHANGE [COLUMN] | プライマリキー、テーブルのシャードキー、インデックステーブルのシャードキー、または複合インデックスの一意の列の名前を変更することはできません。列の制約 (複合インデックスの一意の列を除く) を削除するには、ヒント /*+TDDL: cmd_extra(ALLOW_LOOSE_ALTER_COLUMN_WITH_GSI=true)*/ を使用します。詳細については、「ヒントの使用方法」をご参照ください。列のデフォルト値を変更するには、代わりに SET DEFAULT または DROP DEFAULT を使用します。 |
MODIFY [COLUMN] | CHANGE [COLUMN] と同じ名前変更およびヒント制約が適用されます。 |
ALTER [COLUMN] col_name { SET DEFAULT | DROP DEFAULT } | 列のデフォルト値を設定または削除します。CURRENT_TIMESTAMP 型の列を除き、ロールバックがサポートされています。 |
次のステップ
「CREATE TABLE」: 自動パーティショニングモードでテーブルを作成するための完全な構文リファレンス。
「非パーティション化テーブルとブロードキャストテーブルの作成」: 自動シャーディングでプライマリキーのデータの型がサポートされていないテーブルの場合。
「テーブルのタイプを変更し、パーティショニングルールを修正する」: テーブル作成後にシャーディングルールを変更する方法。
「ヒントの使用方法」: 高度な DDL 操作のためのヒント構文リファレンス。