PolarDB-X新增支持聚簇索引功能,用于自動(dòng)維護(hù)全局二級索引(GSI)中的覆蓋列,保證聚簇索引表和主表的實(shí)時(shí)同步,所有查詢均不用回表,避免因回表帶來的額外開銷。本文介紹如何創(chuàng)建并使用聚簇索引。

前提條件

PolarDB-X內(nèi)核小版本需為5.4.9或以上。

注意事項(xiàng)

  • 聚簇索引是一種特殊的全局二級索引,相關(guān)行為和限制請參考全局二級索引
  • 聚簇索引的覆蓋列默認(rèn)包含主表的所有列,并在主表的列發(fā)生變更時(shí),自動(dòng)同步修改聚簇索引表,保證聚簇索引表和主表的實(shí)時(shí)同步。
  • 聚簇索引表也會和主表的本地索引保持同步。

語法

您可以在建表或加索引的語句中,通過CLUSTERED關(guān)鍵字指定創(chuàng)建的索引為聚簇索引。

  • 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] ...
    說明 僅在主鍵拆分表中可省略拆分規(guī)則即[drds_partition_options]部分。
  • CREATE INDEX:
    CREATE [UNIQUE]
        CLUSTERED INDEX index_name [index_type]
        ON tbl_name (index_col_name,...)
        [drds_partition_options]
        [index_option] ...
    說明 僅在主鍵拆分表中可省略拆分規(guī)則即[drds_partition_options]部分。
  • ALTER TABLE:
    ALTER TABLE tbl_name
        alter_specification
    其中alter_specification支持如下規(guī)則:
    alter_specification:
      | ADD [UNIQUE] CLUSTERED {INDEX|KEY} index_name 
          [index_type] (index_col_name,...)
          [drds_partition_options] 
          [index_option] ...
    說明
    • 聚簇索引相關(guān)變更(即alter_specification部分)僅支持使用一條變更規(guī)則。
    • 聚簇索引必須顯式指定索引名。
    • 僅在主鍵拆分表中可省略拆分規(guī)則(即[drds_partition_options]部分)。

使用示例

假設(shè)已使用如下語句在PolarDB-X數(shù)據(jù)庫中創(chuàng)建了一張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)

添加成功后,您可以使用如下語句查看主表結(jié)構(gòu),來確認(rèn)聚簇索引的定義:

SHOW CREATE TABLE t_order;

返回結(jié)果如下:

+---------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 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)

您還可以通過如下語句查看聚簇索引表結(jié)構(gòu):

SHOW CREATE TABLE c_i;

從如下返回結(jié)果中,可以看到聚簇索引表包含了主表所有的列:

+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 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)