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

:自動シャーディング

最終更新日:Jun 03, 2024

PolarDB-Xは自動シャーディング機能を提供します。 PolarDB-Xは、テーブルの主キーが作成された列のデータ型に基づいて、テーブルのデータをシャードします。 CREATE TABLEステートメントを変更して、シャードテーブルを作成できます。 システムは、主キーおよびインデックスキーに基づいて、シャードキーおよびシャーディングルールを自動的に選択することができる。 これにより、単一ノードのデータベースサービスが分散データベースサービスに変更されます。

前提条件

  • PolarDB-XインスタンスのバージョンはV5.4.9以降です。
  • データベースを作成するとき、MODEパラメーターはdrds/shardingに設定されます。 データベースの作成時にパーティション分割のモードを選択する方法の詳細については、「create database」をご参照ください。

使用上の注意

  • テーブルを作成するときに、テーブルの主キーを指定する必要があります。 テーブルが作成された後、テーブルの主キーは作成できず、テーブルの主キーは削除できません。
  • すべての非ローカルインデックスの名前を指定する必要があります。
  • シャードテーブルのシャーディングルールを変更すると、テーブルは標準テーブルになり、シャードテーブルに使用される自動シャーディングルールとインデックス設定ルールはテーブルに適用されません。 テーブルのシャーディングルールを変更する方法の詳細については、「テーブルのタイプの変更とシャーディングルールの変更 (DRDSモード) 」をご参照ください。

構文

PARTITIONキーワードがCREATE TABLEに追加されます。 この方法では、CREATE PARTITION TABLEステートメントを使用して、主キーがシャードキーとして使用されるテーブルを作成できます。 LOCALGLOBAL、または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変数を設定できます。 次の手順では、テーブルを作成するときに自動シャーディング機能を有効または無効にする方法について説明します。

  1. set @ auto_partition=1; コマンドを実行して、自動シャーディング機能を有効にします。
  2. CREATE TABLEステートメントを使用して、テーブルを作成します。 PARTITIONキーワードはステートメントでは必要ありません。 作成されたテーブルはシャードテーブルです。
  3. テーブルの作成後にテーブルをシャードしない場合は、set @ auto_partition=0; コマンドを実行して自動シャーディング機能を無効にします。

自動シャーディングルール

  • テーブルにプライマリキーが指定されていない場合、PolarDB-Xはテーブルの暗黙のプライマリキーを作成し、その暗黙のプライマリキーをシャードキーとして使用します。 暗黙の主キー列は、BIGINT型のデータを含む自動インクリメントキーです。 暗黙の主キーはユーザーが表示できません。
  • テーブルにプライマリキーが指定されている場合、PolarDB-Xはテーブルのプライマリキーをシャードキーとして使用します。 主キーが複数の列に作成されている場合、左側から1番目の列がシャードキーとして使用されます。
  • 自動シャーディング機能はデータベースシャードのみを作成でき、シャーディングアルゴリズムは主キーのデータ型に基づいて選択されます。 この機能では、テーブルシャードは作成されません。 次の表に、さまざまなデータ型の主キーのシャーディングアルゴリズムを示します。
    データ型シャーディングアルゴリズム
    TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT、CHAR、またはVARCHARHASH
    DATE、DATETIME、またはTIMESTAMPYYYYDD
    ビット、フロート、ダブル、時間、年、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 なし
  • [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 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型の場合、その列で実行された操作をロールバックすることはできません。