分散データベースでは、インデックスキー列でフィルター処理を行うクエリであっても、非インデックス列を返す場合、テーブルルックアップ(ベーステーブルから該当するインデックスエントリを検索した後にデータを取得)が必要になります。この追加のラウンドトリップにより、ネットワーク I/O が増加し、クエリのレイテンシーが高まります。
クラスター化インデックスは、このオーバーヘッドを解消します。これは、ベーステーブルのすべての列を含む特殊なタイプのグローバルセカンダリインデックス(GSI)です。クラスター化インデックスから提供されるクエリは、ベーステーブルのスキャンを経由せずに必要なすべての列を取得できるため、I/O およびクエリのレイテンシーを低減します。
PolarDB-X は、列のカバー率を自動的に管理し、クラスター化インデックスをベーステーブルと同期した状態に保ちます。
前提条件
開始する前に、以下の条件を満たしていることを確認してください。
カーネルバージョン V5.4.9 以降で実行中の PolarDB-X インスタンス
仕組み
インデックス定義に CLUSTERED キーワードを追加すると、PolarDB-X はベーステーブルのすべての列をミラーしたインデックステーブルを作成します。読み取り操作はこのインデックステーブルに直接アクセスし、ベーステーブルのスキャンをスキップします。また、ベーステーブルにおける任意の列の更新は、クラスター化インデックスに自動的に反映されます。さらに、ベーステーブル上のローカルインデックスもクラスター化インデックステーブルと同期されます。
クラスター化インデックスの作成
任意のインデックス定義に CLUSTERED キーワードを追加します。PolarDB-X では、以下の 3 つの方法がサポートされています。
クラスター化インデックス付きテーブルの作成
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 を使用する方法:
CREATE [UNIQUE]
CLUSTERED INDEX index_name [index_type]
ON tbl_name (index_col_name,...)
[drds_partition_options]
[index_option] ...テーブルのシャードキーとしてプライマリキーを使用する場合は、[drds_partition_options] からシャーディングルールを省略します。ALTER TABLE を使用する方法:
ALTER TABLE tbl_name
alter_specification
alter_specification:
| ADD [UNIQUE] CLUSTERED {INDEX|KEY} index_name
[index_type] (index_col_name,...)
[drds_partition_options]
[index_option] ...ALTER TABLE を使用する場合:alter_specification 句には、シャーディングルールを 1 つだけ指定してください。クラスター化インデックスには必ず名前を指定してください。
テーブルのシャードキーとしてプライマリキーを使用する場合は、[drds_partition_options] からシャーディングルールを省略します。例
以下の例では、パーティションテーブルを作成し、seller_id および x 列にクラスター化インデックスを追加した後、結果を検証します。
ベーステーブルの作成:
CREATE PARTITION TABLE `t_order` (
`t` timestamp null default CURRENT_TIMESTAMP,
`x` int default 3,
`order_id` varchar(20) DEFAULT NULL,
`seller_id` varchar(20) DEFAULT NULL
);クラスター化インデックスの作成:
CREATE CLUSTERED INDEX `c_i` ON `t_order` (seller_id, x)ベーステーブルスキーマの検証:
SHOW CREATE TABLE t_order;出力には、ローカルキーおよびクラスター化インデックスのエントリの両方が表示されます。
+---------+-----------------------------------------------------------------------------------------------+
| Table | Create Table |
+---------+-----------------------------------------------------------------------------------------------+
| t_order | CREATE PARTITION TABLE `t_order` (
`t` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
`x` int(11) DEFAULT '3',
`order_id` varchar(20) DEFAULT NULL,
`seller_id` varchar(20) DEFAULT NULL,
LOCAL KEY `_local_c_i` (`seller_id`, `x`),
CLUSTERED INDEX `c_i`(`seller_id`, `x`) DBPARTITION BY HASH(`seller_id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 |
+---------+-----------------------------------------------------------------------------------------------+
1 row in set (0.08 sec)クラスター化インデックススキーマの検証:
SHOW CREATE TABLE c_i;出力より、クラスター化インデックスがベーステーブルのすべての列を含むことが確認できます。
+-------+---------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+---------------------------------------------------------------------------------------------------+
| c_i | CREATE TABLE `c_i` (
`t` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
`x` int(11) DEFAULT '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` USING BTREE (`seller_id`, `x`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 dbpartition by hash(`seller_id`) |
+-------+---------------------------------------------------------------------------------------------------+
1 row in set (0.03 sec)次のステップ
クラスター化インデックスに適用される操作および制限事項の完全な一覧については、「GSI」をご参照ください。