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公众号.
如需“商务咨询“或”开源交流“, 速加小编微信.





