开发指南—透明分布式—聚簇索引

本文涉及的产品
云原生数据库 PolarDB 分布式版,标准版 2核8GB
简介: PolarDB-X新增支持聚簇索引功能,用于自动维护全局二级索引(GSI)中的覆盖列,保证聚簇索引表和主表的实时同步,所有查询均不用回表,避免因回表带来的额外开销。本文介绍如何创建并使用聚簇索引。

前提条件

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)
相关实践学习
Polardb-x 弹性伸缩实验
本实验主要介绍如何对PolarDB-X进行手动收缩扩容,了解PolarDB-X 中各个节点的含义,以及如何对不同配置的PolarDB-x 进行压测。
相关文章
|
数据库 索引
【笔记】开发指南—透明分布式—聚簇索引
PolarDB-X新增支持聚簇索引功能,用于自动维护全局二级索引(GSI)中的覆盖列,保证聚簇索引表和主表的实时同步,所有查询均不用回表,避免因回表带来的额外开销。本文介绍如何创建并使用聚簇索引。
122 0
|
数据库 索引
开发指南—透明分布式—聚簇索引
PolarDB-X新增支持聚簇索引功能,用于自动维护全局二级索引(GSI)中的覆盖列,保证聚簇索引表和主表的实时同步,所有查询均不用回表,避免因回表带来的额外开销。本文介绍如何创建并使用聚簇索引。
|
11天前
|
NoSQL 算法 安全
Redlock 算法-主从redis分布式锁主节点宕机锁丢失的问题
Redlock 算法-主从redis分布式锁主节点宕机锁丢失的问题
30 0
|
11天前
|
NoSQL 关系型数据库 MySQL
分布式锁(redis/mysql)
分布式锁(redis/mysql)
29 1
|
2月前
|
NoSQL Java 测试技术
字节二面:Spring Boot Redis 可重入分布式锁实现原理?
字节二面:Spring Boot Redis 可重入分布式锁实现原理?
140 1
|
2月前
|
存储 缓存 NoSQL
【分布式】Redis与Memcache的对比分析
【1月更文挑战第25天】【分布式】Redis与Memcache的对比分析
|
2月前
|
监控 NoSQL Linux
【分布式】Redis的持久化方案解析
【1月更文挑战第25天】【分布式】Redis的持久化方案解析
|
18天前
|
缓存 NoSQL Java
【Redis】5、Redis 的分布式锁、Lua 脚本保证 Redis 命令的原子性
【Redis】5、Redis 的分布式锁、Lua 脚本保证 Redis 命令的原子性
38 0
|
11天前
|
人工智能 监控 NoSQL
【万字长文 一文搞定】Redis:从新手村到大师殿堂的奥德赛之旅 9种实现分布式锁的全技术指南
【万字长文 一文搞定】Redis:从新手村到大师殿堂的奥德赛之旅 9种实现分布式锁的全技术指南
65 4
|
12天前
|
消息中间件 存储 NoSQL
【Redis项目实战】使用Springcloud整合Redis分布式锁+RabbitMQ技术实现高并发预约管理处理系统
【Redis项目实战】使用Springcloud整合Redis分布式锁+RabbitMQ技术实现高并发预约管理处理系统

相关产品

  • 云原生分布式数据库 PolarDB-X