前提条件
PolarDB-X内核小版本需为5.4.9或以上。
注意事项
- 聚簇索引是一种特殊的全局二级索引,相关行为和限制请参考全局二级索引。
- 聚簇索引的覆盖列默认包含主表的所有列,并在主表的列发生变更时,自动同步修改聚簇索引表,保证聚簇索引表和主表的实时同步。
- 聚簇索引表也会和主表的本地索引保持同步。
语法
您可以在建表或加索引的语句中,通过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:
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
支持如下规则:
alter_specification: | ADD [UNIQUE] CLUSTERED {INDEX|KEY} index_name [index_type] (index_col_name,...) [drds_partition_options] [index_option] ...
- 说明
- 聚簇索引相关变更(即
alter_specification
部分)仅支持使用一条变更规则。 - 聚簇索引必须显式指定索引名。
- 仅在主键拆分表中可省略拆分规则(即
[drds_partition_options]
部分)。
使用示例
假设已使用如下语句在PolarDB-X数据库中创建了一张t_order
表:
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 -> );
您可以使用如下语句为t_order
表添加聚簇索引:
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)