PolarDB-Xはクラスタ化インデックスをサポートします。 PolarDB-Xは、グローバルセカンダリインデックスのカバー列を自動的に管理し、ベーステーブルからクラスター化インデックスにデータを同期します。 このようにして、ベーステーブルをスキャンする必要なしに、要求されたデータをインデックステーブルから照会することができる。 これにより、リソースのオーバーヘッドを削減できます。 このトピックでは、クラスター化インデックスを作成して使用する方法について説明します。
前提条件
PolarDB-XインスタンスのカーネルバージョンはV5.4.9以降です。
注意
- クラスター化インデックスは、特殊なタイプのグローバルセカンダリインデックスです。 クラスター化インデックスの操作と制限の詳細については、「GSI」をご参照ください。
- 既定では、テーブルのクラスター化インデックスの対象となる列には、テーブル内のすべての列が含まれます。 テーブルの列を更新すると、変更は自動的にクラスター化インデックステーブルに同期されます。 これにより、ベーステーブルとクラスター化インデックステーブル間でデータの一貫性が確保されます。
- ベーステーブルのローカルインデックスも、クラスタ化インデックステーブルに同期されます。
構文
テーブルまたはテーブルのインデックスを作成するときに、インデックスの作成に使用される句にCLUSTERED
キーワードを追加できます。 このように、作成されたインデックスは、テーブルのクラスタ化インデックスです。
- 次のサンプルコードは、CREATE TABLEステートメントを使用してテーブルとテーブルのクラスター化インデックスを作成する方法を示しています。
create [SHADOW] table [IF NOT EXISTS] tbl_name (create_definition, ...) [table_options] [drds_partition_options] create_definition: [UNIQUE] CLUSTERED INDEX index_name [index_type] (index_col_name,...) [drds_partition_options] [index_option] ...
説明 作成するテーブルが主キーをシャードキーとして使用している場合、[drds_partition_options]
句でシャーディングルールを指定する必要はありません。 - 次のサンプルコードは、CREATE INDEXステートメントを使用してテーブルのクラスター化インデックスを作成する方法を示しています
。 CLUSTERED INDEX index_name [index_type] ON tbl_name (index_col_name,...) [drds_partition_options] [index_option] ...
説明 インデックスを作成するテーブルが主キーをシャードキーとして使用している場合、[drds_partition_options]
句でシャーディングルールを指定する必要はありません。 - 次のサンプルコードは、ALTER TABLEステートメントを使用してテーブルのクラスター化インデックスを作成する方法を示しています
。 alter_仕様
次のサンプルコードは、alter_specification
句を指定する方法を示しています。| ADD [UNIQUE] CLUSTERED {INDEX | KEY} index_name [index_type] (index_col_name,...) [drds_partition_options] [index_option] ...
説明- テーブルのクラスター化インデックスを変更するには、
alter_specification
句で1つのシャーディングルールのみを指定できます。 - クラスター化インデックスの名前を指定する必要があります。
- 変更するテーブルが主キーをシャードキーとして使用している場合、
[drds_partition_options]
句でシャーディングルールを指定する必要はありません。
- テーブルのクラスター化インデックスを変更するには、
例
次のステートメントを使用して、PolarDB-Xデータベースにt_order
という名前のテーブルを作成できます。
パーティションの作成TABLE 't_order' (
-> 't' タイムスタンプnullデフォルトCURRENT_TIMESTAMP、
-> 'x' int default 3、
-> 'order_id' varchar(20) DEFAULT NULL、
-> 'seller_id' varchar(20) デフォルトNULL
-> );
次のステートメントを使用して、t_order
テーブルのクラスター化インデックスを作成できます。
CLUSTERED INDEX 'c_i' ON 't_order' (seller_id, x)
を作成するクラスター化インデックスの作成後、次のステートメントを使用してベーステーブルのスキーマを照会し、クラスター化インデックスに関する情報を確認できます。
SHOW CREATE TAB_order;
この例では、次の情報が返されます。
+ --------- + -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +
| テーブル | テーブルの作成 |
+ --------- + -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +
| t_order | パーティションの作成TABLE 't_order' (
't' タイムスタンプNULLデフォルトCURRENT_TIMESTAMP、
'x' int(11) デフォルト '3' 、
'order_id' varchar(20) DEFAULT NULL、
'seller_id 'varchar(20) DEFAULT NULL、
ローカルキー '_local_c_i' ('seller_id' 、'x') 、
CLUSTERED INDEX 'c_i'('seller_id' 、'x') DBPARTITION BY HASH('seller_id')
) エンジン=InnoDBデフォルト料金セット=utf8mb4 |
+ --------- + -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +
1行セット (0.08秒)
次の文を使用して、クラスタ化インデックスのスキーマを照会できます。
SHOW CREATE TABLE c_i;
返された情報は、クラスタ化インデックスにベーステーブルのすべての列が含まれていることを示します。
+ ------- + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +
| テーブル | テーブルの作成 |
+ ------- + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +
| c_i | CREATE TABLE 'c_i' (
't' タイムスタンプNULLデフォルトCURRENT_TIMESTAMP、
'x' int(11) デフォルト '3' 、
'order_id' varchar(20) DEFAULT NULL、
'seller_id 'varchar(20) DEFAULT NULL、
KEY 'auto_shard_key_seller_id 'USING BTREE ('seller_id') 、
KEY 'i_seller_id_x '使用してBTREE ('seller_id' 、'x')
) ENGINE = InnoDB DEFAULT CHARSET=ハッシュによるutf8mb4 dbpartition ('seller_id') |
+ ------- + ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- +
1行セット (0.03秒)