【笔记】开发指南—常见问题—如何使用全局二级索引

简介: PolarDB-X支持全局二级索引,本文将在分库分表语法下介绍如何创建、使用全局二级索引功能。

使用限制

  • 如果在分区表下,该文档依然试用,只不过创建语法需要参考CREATE INDEX
  • 关于创建和使用GSI的相关限制,请参考

创建GSI

PolarDB-X对MySQL DDL语法进行了扩展,增加定义GSI的语法。使用方式与在MySQL上创建索引一致。

  • 建表时定义GSI1..png
  • 建表后添加GSI

2..png

说明

  • 索引名:作为索引表的名字,用于创建索引表。
  • 索引列:索引表的分库分表键,即索引分库分表子句中用到的所有列。
  • 覆盖列:索引表中的其他列,默认包含主键和主表的全部分库分表键。
  • 索引分库分表子句:索引表的分库分表算法,与CREATE TABLE中分库分表子句的语法一致。
  • 上述是在分库分表下的创建GSI语法,如果是在分区表下GSI语法只需要可以参考CREATE INDEX

示例:


# 建表时定义GSI
CREATE TABLE t_order (
`id` bigint(11) NOT NULL AUTO_INCREMENT,
`order_id` varchar(20) DEFAULT NULL,
`buyer_id` varchar(20) DEFAULT NULL,
`seller_id` varchar(20) DEFAULT NULL,
`order_snapshot` longtext DEFAULT NULL,
`order_detail` longtext DEFAULT NULL,
PRIMARY KEY (`id`),
GLOBAL INDEX `g_i_seller`(`seller_id`) COVERING (`id`, `order_id`, `buyer_id`, `order_snapshot`) dbpartition by hash(`seller_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 dbpartition by hash(`order_id`);
# 添加GSI
CREATE UNIQUE GLOBAL INDEX `g_i_buyer` ON `t_order`(`buyer_id`)
COVERING(`seller_id`, `order_snapshot`)
dbpartition by hash(`buyer_id`) tbpartition by hash(`buyer_id`) tbpartitions 3

使用GSI

GSI创建完成后,可以通过如下方式指定查询使用的索引表:

  • 通过HINT指定索引您可以选择以下两种HINT语句中的任意一种指定使用目标索引进行查询。

FORCE INDEX({index_name})
    • 示例:
SELECT a.*, b.order_id 
FROM t_seller a
JOIN t_order b FORCE INDEX(g_i_seller) ON a.seller_id = b.seller_id
WHERE a.seller_nick="abc";

/+TDDL:INDEX({table_name/table_alias}, {index_name})/
    • 示例:
/+TDDL:index(a, g_i_buyer)/ SELECT * FROM t_order a WHERE a.buyer_id = 123
  • 说明 如果查询需要使用索引中未包含的列,则首先查询索引表取得所有记录的主键和主表分库分表键,然后回查主表中取得缺少列的值,详细说明请参见。
  • 直接查询索引表如果索引表中包含了查询需要的所有列,可以直接查询索引表获得结果。
  • 索引选择对于带有全局二级索引的主表查询,PolarDB-X会自动选择出优化器认为代价最低的索引表(目前只支持覆盖索引选择)。下面SQL查询的主表是t_order,带有seller_id等值过滤条件,同时涉及的id、order_snapshot和seller_id等列被全局二级索引g_i_seller覆盖。选择了覆盖索引g_i_seller既可以不回表,又可以明确减少分表的扫描数目(seller_id是g_i_seller的拆分键)。通过EXPLAIN可以看到PolarDB-X优化器确实选择了g_i_seller。
EXPLAIN SELECT t_order.id,t_order.order_snapshot FROM t_order WHERE t_order.seller_id = 's1';
IndexScan(tables="g_i_seller_sfL1_2", sql="SELECT `id`, `order_snapshot` FROM `g_i_seller` AS `g_i_seller` WHERE (`seller_id` = ?)")
  • IGNORE INDEX与USE INDEX您可以通过以下HINT指定优化器使用或不使用某些索引。

IGNORE INDEX({index_name},...)
    • 示例:
SELECT t_order.id,t_order.order_snapshot FROM t_order IGNORE INDEX(g_i_seller) WHERE t_order.seller_id = 's1';

USE INDEX({index_name},...)
    • 示例:
SELECT t_order.id,t_order.order_snapshot FROM t_order USE INDEX(g_i_seller) WHERE t_order.seller_id = 's1';

注意事项

  • 创建GSI过程的约束
    • 不支持在单表或广播表上创建GSI。
    • 不支持在无主键的表上创建GSI。
    • 不支持在UNIQUE GSI中通过任何方式使用前缀索引。
    • 创建索引表时必须指定索引名。
    • 创建索引表时必须指定分库或分库加分表组合的规则,不允许仅指定分表规则或不指定任何拆分规则。
    • 索引表的INDEX列必须包含全部拆分键。
    • GSI定义子句中,索引列与覆盖列不可重复。
    • 索引表默认包含主表的全部主键和拆分键,如果没有显式包含在索引列中,默认添加到覆盖列。
    • 对主表中的每个局部索引,如果引用的所有列均包含在索引表中,默认添加该局部索引到索引表。
    • 对GSI的每个索引列,如果没有已经存在的索引,默认单独创建一个索引。
    • 对包含多个索引列的GSI,默认创建一个联合局部索引,包含所有索引列。
    • 索引定义中,索引列的length参数仅用于在索引表拆分键上创建局部索引。
    • 建表后创建GSI时,会在GSI创建结束时自动进行数据校验,只有通过校验,创建GSI的DDL语句才能执行成功。
  • 说明 您也可以使用CHECK GLOBAL INDEX对索引数据进行校验或订正。
  • Alter Table过程的约束
语句 是否支持变更主表拆分键 是否支持变更主表主键(也即索引表主键) 是否支持变更本地唯一索引列 是否支持变更索引表拆分键 是否支持变更Unique Index列 是否支持变更Index列 是否支持变更Covering列
ADD COLUMN 无该场景 不支持 无该场景 无该场景 无该场景 无该场景 无该场景
ALTER COLUMN SET DEFAULT和ALTER COLUMN DROP DEFAULT 不支持 不支持 支持 不支持 不支持 不支持 不支持
CHANGE COLUMN 不支持 不支持 支持 不支持 不支持 不支持 不支持
DROP COLUMN 不支持 不支持 仅当唯一键中只有1列时支持 不支持 不支持 不支持 不支持
MODIFY COLUMN 不支持 不支持 支持 不支持 不支持 不支持 不支持
  • 说明
    • 考虑到全局二级索引的稳定性和性能情况,目前禁止直接使用DROP COLUMN命令删除全局二级索引中的列。如需删除全局二级索引中的某些列,您可以先使用DROP INDEX删除对应的全局二级索引,再重新创建一个新的二级索引,或提交工单联系技术支持进行删除。
    • 以上对列的分类存在重叠(如Index列包含索引表拆分键,Covering列包含主表拆分键、主键以及指定的列),若存在支持情况冲突情况,不支持的优先级高于支持。
  • 下表汇总了使用ALTER TABLE语句变更索引的支持情况
语句 是否支持
ALTER TABLE ADD PRIMARY KEY 支持
ALTER TABLE ADD [UNIQUE/FULLTEXT/SPATIAL/FOREIGN] KEY 支持,您可以同时在主表和索引表上添加局部索引,索引名称不可与GSI重复。
ALTER TABLE ALTER INDEX index_name {VISIBLE | INVISIBLE} 支持,仅在主表执行(禁止变更GSI状态)。
ALTER TABLE {DISABLE | ENABLE} KEYS 支持,仅在主表执行(禁止变更GSI状态)。
ALTER TABLE DROP PRIMARY KEY 禁止
ALTER TABLE DROP INDEX 仅支持删除普通索引或全局二级索引。
ALTER TABLE DROP FOREIGN KEY fk_symbol 支持,仅在主表执行。
ALTER TABLE RENAME INDEX 禁止
  • 说明 考虑到全局二级索引的稳定性和性能情况,目前禁止直接使用DROP COLUMN命令重命名全局二级索引。如需修改全局二级索引名,您可以先使用DROP INDEX删除对应的全局二级索引,再重新创建一个新的二级索引,或提交工单联系技术支持进行修改。
  • Alter GSI Table的约束条件
    • 不支持在索引表上执行DDL、DML语句。
    • 不支持带有NODE HINT的DML语句更新主表、索引表。
  • 在包含GSI的表上使用其他DDL时的约束
语句 是否支持
DROP TABLE 支持
DROP INDEX 支持
TRUNCATE TABLE 不支持
RENAME TABLE 不支持
ALTER TABLE RENAME 不支持
  • 说明
    • 考虑主表与索引表的数据一致性,目前禁止执行TRUNCATE TABLE语句 。如需清空主表与索引表数据,您可以使用DELETE语句删除对应的数据,或强制使用HINT /+TDDL:CMD_EXTRA(TRUNCATE_TABLE_WITH_GSI=TRUE)/
    • 考虑到全局二级索引的稳定性和性能情况,目前禁止直接使用RENAME TABLE或ALTER TABLE RENAME命令重命名全局二级索引。如需修改全局二级索引名,您可以先使用DROP INDEX删除全局二级索引,修改表名后再重新创建新的二级索引,或提交工单联系技术支持进行修改。
  • 在包含GSI的表上使用DML语句时的约束
    • 不支持在索引表上执行DML语句。
    • 在主表上执行DML语句的有如下限制:写索引失败后,不允许继续执行其他语句或提交事务。
CREATE TABLE t_order(
`id` bigint(11) NOT NULL AUTO_INCREMENT,
`order_id` varchar(20) DEFAULT NULL,
`buyer_id` varchar(20) DEFAULT NULL,
`seller_id` varchar(20) DEFAULT NULL,
`order_snapshot` longtext DEFAULT NULL,
`order_detail` longtext DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `l_i_order` (`order_id`),
GLOBAL INDEX `g_i_seller` (`seller_id`) dbpartition by hash(`seller_id`) tbpartition by hash(`seller_id`),
GLOBAL UNIQUE INDEX `g_i_buyer` (`buyer_id`) COVERING (order_snapshot) dbpartition by hash(`buyer_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 dbpartition by hash(`order_id`);
SET DRDS_TRANSACTION_POLICY='XA';
INSERT INTO t_order(order_id, buyer_id, seller_id) VALUES('order_1', 'buyer_1', 'seller_1');
# 失败
INSERT IGNORE INTO t_order(order_id, buyer_id, seller_id) VALUES('order_2', 'buyer_1', 'seller_1');
# 失败不允许继续执行
INSERT IGNORE INTO t_order(order_id, buyer_id, seller_id) VALUES('order_2', 'buyer_2', 'seller_2');
# 失败后不允许提交事务
COMMIT;
相关文章
|
人工智能 监控 供应链
AI技术创业有哪些机会?
本文探讨了AI技术创业的多个机会,包括提供行业解决方案、开发智能产品和服务以及教育和培训,为创业者在医疗保健、金融服务、零售、教育等多个领域提供了丰富的机遇。
753 2
|
11月前
|
缓存 安全 数据挖掘
阿里云服务器目前活动中各实例规格适用场景汇总,选择指南参考
本文将基于2025年阿里云服务器相关活动的最新内容,对各个实例规格的适用场景进行详细汇总,并提供选择指南参考,帮助用户轻松选购到最适合自己的云服务器实例。
|
JavaScript 信息无障碍
无障碍工具条本地化安装部署
无障碍工具条安装部署教程
416 1
无障碍工具条本地化安装部署
|
移动开发 前端开发 JavaScript
Twaver-HTML5基础学习(13)连线(Link)连线的绑定与展开
本文介绍了Twaver HTML5中连线(Link)的绑定与展开功能,包括分组绑定、自环绑定、绑定与展开以及展开间隙等属性的设置。通过示例代码展示了如何在React组件中创建Link并设置其绑定属性,实现连线的分组管理。
190 4
Twaver-HTML5基础学习(13)连线(Link)连线的绑定与展开
|
人工智能 Cloud Native 关系型数据库
双位数增长,阿里云连续五年领跑关系型数据库
阿里云蝉联中国关系型数据库整体市场份额第一,在公有云业务双位数增长的驱动下,阿里云同时在公有云关系型数据库市场取得了38%的市场份额,连续五年位居首位。
|
自然语言处理 Windows
推荐给大家5款小众无广告的软件
本文推荐了几款小众且无广告的实用软件:ProcessExplorer 是一款强大的系统进程管理工具;LanguageTool 则是多语言语法检查工具;燃精灵用于检测微信空号;GeekUninstaller 可深度清理卸载软件残留;Win10Apps 专为管理 Windows10 应用而设计。感兴趣的朋友可以自行搜索下载。
431 17
|
传感器 人工智能 监控
未来出行的革新:智能交通系统的崛起
【10月更文挑战第9天】 智能交通系统(ITS)正在改变我们未来的出行方式。本文深入探讨了ITS的技术原理、关键组成部分以及其在不同领域的实际应用,并讨论了面临的挑战及未来发展的前景。通过阐述这些内容,本文揭示了智能交通系统在提升交通效率、安全性和可持续性方面的巨大潜力。
|
敏捷开发 数据可视化 BI
配置状态报告是什么?包括哪些编制步骤?需要注意哪些关键环节?
配置状态报告(CSR)是项目管理和系统开发中用于跟踪和记录项目配置项状态的重要工具,涵盖软件、硬件、文档等。它不仅提供项目当前状态、历史变更及发展趋势的清晰视图,还通过增强项目透明度、有效管理变更、支持决策制定和促进知识共享,帮助项目团队做出明智决策,确保项目按计划顺利进行。随着项目规模和复杂度的增加,CSR的重要性愈发凸显,现代项目管理工具已实现其编制和管理的自动化与智能化。
|
敏捷开发 Devops 持续交付
《SAFe 5.0精粹 面向业务的规模化敏捷框架》 读书笔记
本书由李建昊老师翻译,介绍《SAFe 5.0精粹 面向业务的规模化敏捷框架》。SAFe(Scaled Agile Framework)为企业提供精益、敏捷及DevOps的知识库,涵盖13门课程与认证。SAFe具备七个核心能力,如精益-敏捷领导力等,并提供不同配置以适应各种需求,包括基本型、大型解决方案及投资组合SAFe等。此外,SAFe还强调持续学习文化及精益思维,助力企业实现业务敏捷化转型。
320 0
《SAFe 5.0精粹 面向业务的规模化敏捷框架》 读书笔记
|
安全 物联网 网络安全
零日漏洞:潜伏在网络世界的隐形杀手
【8月更文挑战第31天】
877 1

热门文章

最新文章