すべてのプロダクト
Search
ドキュメントセンター

PolarDB:自動分割モードでの自動シャーディング

最終更新日:May 28, 2024

このトピックでは、自動パーティショニングモードで主キーに基づいて自動的にシャードされるテーブルの自動シャーディングルールとインデックス変換ルールについて説明します。

既定では、自動パーティション分割モードでデータベースを作成するときにパーティション分割方法を指定しない場合、データベース内のテーブルは主キーに基づいてシャードされます。

前提条件

  • 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
  • [UNIQUE] LOCAL INDEX句を使用すると、PolarDB-Xはローカルインデックスを作成し、そのローカルインデックスをテーブルのクラスタ化インデックスに自動的に追加します。
  • [UNIQUE] INDEX句を使用すると、PolarDB-Xはグローバルセカンダリインデックスを作成し、名前に _local_ プレフィックスが含まれる対応するローカルインデックスを作成します。 ローカルインデックスは、テーブルのクラスタ化インデックスに自動的に追加されます。
  • [UNIQUE] GLOBAL | CLUSTERED INDEX句を使用すると、PolarDB-Xは、設定に基づいて一意のグローバルセカンダリインデックスまたはクラスタ化インデックスを作成し、名前に _local_ プレフィックスが含まれるローカルインデックスを自動的に作成し、ローカルインデックスをテーブルのクラスタ化インデックスに追加します。
    説明 シャードキーを指定しない場合、システムは自動シャーディングルールを使用します。
テーブルの変更ADD {INDEX | KEY} [index_name] [index_type] (key_part,...) [index_option] ...
ADD [COLUMN] (col_name column_definition,...)
  • この句を使用してテーブルに列を追加すると、PolarDB-Xは新しい列をクラスター化されたグローバルセカンダリインデックスとテーブルの一意のクラスター化されたグローバルセカンダリインデックスに自動的に追加します。
  • 操作をロールバックできます。
ドロップ [コラム] col_nameこの句を使用して、テーブルの主キーまたはシャードキー、インデックステーブルのシャードキー、または複合インデックスの一意の列を削除することはできません。
CHANGE [COLUMN] old_col_name new_col_name column_definition [FIRST | AFTER col_name]
  • これらの句を使用して、テーブルの主キーまたはシャードキー、またはインデックステーブルのシャードキーの名前を変更することはできません。
  • これらの句を使用して、複合インデックスの一意の列の名前を変更することはできません。
    説明 /* + TDDL: cmd_extra(ALLOW_LOOSE_ALTER_COLUMN_WITH_GSI=true)*/ ヒントを使用して、列の制約を削除できます。 複合インデックスの一意の列に対する制約は削除できません。 詳細については、「ヒントの使用方法」をご参照ください。
  • 列のデフォルト値を変更する場合は、SET default句またはDROP DEFAULT句を使用することを推奨します。
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型の場合、その列で実行された操作をロールバックすることはできません。