暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PolarDB-X 全局二级索引详解

PolarDB 2025-10-09
14

PolarDB-X 全局二级索引详解

本文将详细介绍PolarDB-X 中的全局二级索引 (GSI) 功能。GSI 通过维护跨数据库分区的二级索引,实现跨分片数据的高效查询。本文内容将涵盖全局二级索引的架构、创建流程、回填机制以及维护。

概述

PolarDB-X 中的全局二级索引允许应用程序跨数据库分区高效查询数据,同时又不影响分片的可扩展性优势。与局限于单个分区的本地索引不同,全局二级索引跨越所有分片,为查询优化提供统一的视图。

图:PolarDB-X 架构中的 GSI

关键概念

索引类型

PolarDB-X支持不同类型的全局二级索引,包括:

  • 全局普通索引:允许非唯一值的标准二级索引
  • 全局唯一索引:确保所有分区的唯一性
  • 全局主键:作为主要访问路径的特殊类型的唯一索引

每种类型的索引都作为数据库中单独的物理表实现,下表维护索引键和源表的主键之间的映射。

图:GSI 物理实现和查询流程

GSI 创建过程

在 PolarDB-X 中创建全局二级索引涉及以下几个步骤:

  • DDL解析:系统解析CREATE INDEX
    语句
  • 创建GSI 表:创建一个新的物理表来存储全局二级索引的数据
  • 元数据注册:索引在系统元数据中注册
  • 启动回填:系统启动使用现有数据填充索引的过程

图:GSI 创建流程

CREATE INDEX 语法

要创建全局二级索引,请使用带有 PolarDB-X 扩展的标准 SQL 语法:

CREATE GLOBAL INDEX idx_name ON table_name (column1, column2, ...)  
[COVERING (column3, column4, ...)]  
[partition_options]  

COVERING
子句允许指定索引表中包含的附加列以支持覆盖查询,这些查询可以直接从索引中检索而无需访问主表。可有效提升使用全局索引查询非索引列的SQL性能.

partition_options
允许为索引表指定与主表不同的分区策略。

回填过程

回填过程会使用主表中的现有数据填充全局二级索引。此过程可确保索引在创建后即可完全用于查询。

回填阶段

  • 规划:确定提取数据的最佳策略
  • 提取:从主表读取数据
  • 转换:将数据转换为索引格式
  • Loading:将数据写入索引表
  • 验证:确保索引一致性

图表:GSI 回填过程

数据转换

在回填过程中,PolarDB-X 使用专门的转换逻辑将主表数据转换为索引格式。Transformer
类负责处理此转换,确保所有 MySQL 数据类型都能得到正确的处理。

转换过程处理特殊情况,例如:

  • 零日期/时间值
  • 二进制和字符数据
  • 十进制和浮点精度
  • 大对象(BLOB、TEXT)

有 GSI 时的 DML 处理逻辑

当通过 INSERT、UPDATE 或 DELETE 操作修改主表中的数据时,必须传播这些更改以维护全局二级索引的一致性。

DML 工作流

图表:有 GSI 时的 DML 处理逻辑

事务一致性

PolarDB-X 确保对主表及其全局二级索引的更改在事务上保持一致。这是通过以下方式实现的:

  • 写入操作跟踪:捕获事务执行期间的所有写入操作
  • 两阶段准备:准备主表和索引表之间的更改
  • 原子提交:确保所有更改都作为一个单元提交或回滚

使用 GSI 进行查询加速

PolarDB-X 的优化器决定何时使用全局二级索引来提升查询性能。该决策基于以下因素:

  • 查询谓词及其选择性(谓词相关字段的统计信息决定)
  • 索引可用性和覆盖范围
  • 跨分片的数据分布
  • 比较索引访问与表扫描的成本估算

索引选择

图:查询处理中的索引选择

维护和管理

索引状态检查

PolarDB-X提供了检查全局索引状态的命令:

DRDS CHECK GLOBAL INDEX index_name ON table_name  

此命令验证索引一致性并提供有关检测到的任何不一致的信息。

索引 HINT

应用程序可以通过索引HINT控制索引的使用:

SELECT * FROM table_name FORCE INDEX(index_name) WHERE ...  

访问者模式用于在SQL解析和优化过程中处理这些提示。

性能考虑

何时使用 GSI

全局二级索引在以下场景中最有用:

情境
好处
利弊权衡
使用非分片列的查询
避免跨所有分片进行全表扫描
增加了写入操作的开销
高读写比工作负载
优化读取性能
一些写入延迟增加
复杂的报告查询
实现高效的数据访问模式
需要额外的存储空间
非分片键的范围查询
提高范围扫描性能
索引维护成本

覆盖索引

为了获得最佳性能,请考虑创建覆盖索引,其中包含常见查询中引用的所有列。这样就无需在查询执行期间跨分片访问主表。

使用限制

  • 写入开销:每个 DML 操作都需要额外的写入来维护索引一致性
  • 存储要求:每个 GSI 都会消耗与索引数据成比例的额外存储空间
  • 创建时间:对于大型表,索引创建和回填可能需要花费大量时间
  • 维护操作:schema 更改可能需要重建索引

总结

PolarDB-X 中的全局二级索引提供了一种强大的机制,可以在分布式数据库中跨分区进行高效查询。它支持原本需要进行高成本全表扫描的查询模式,从而平衡了分片的可扩展性优势和传统数据库的查询灵活性。

欢迎关注PolarDB公众号.

如需“商务咨询“或”开源交流“, 速加小编微信.


文章转载自PolarDB,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论