Use of Index Extensions

本文涉及的产品
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,基础系列 4核8GB
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: InnoDB通过向辅助索引附加主键列自动扩展索引,优化器利用这一特性可生成更高效的查询执行计划。例如,对于定义了主键(i1,i2)和二级索引k_d的表,InnoDB实际将k_d视为(d,i1,i2)。这种扩展能显著提升查询性能,如使用扩展索引时,`key_len`、`ref`值和所需检查的行数均有所优化,同时`Extra`信息显示为`using index`,意味着仅使用索引即可读取数据行。此外,`SHOW STATUS`命令显示使用扩展索引时`Handler_read_next`值更小,证明索引使用效率更高。

InnoDB通过向每个辅助索引附加主键列来自动扩展它。考虑以下表定义:

image.png

此表定义了列(i1,i2)上的主键。它还在列(d)上定义了一个二级索引k_d,但InnoDB在内部扩展了这个索引,并将其视为列(d,i1,i2)。
优化器在确定如何以及是否使用该索引时,会考虑扩展辅助索引的主键列。这可以带来更高效的查询执行计划和更好的性能。
优化器可以将扩展的辅助索引用于ref、range和index_merge索引访问、松散索引扫描访问、连接和排序优化以及MIN()/MAX()优化。
以下示例显示了优化器是否使用扩展的辅助索引如何影响执行计划。假设t1填充了以下行:

image.png

现在考虑这个查询:

image.png

执行计划取决于是否使用扩展索引
当优化器不考虑索引扩展时,它只将索引k_d视为(d)。查询的EXPLAIN产生以下结果:

image.png

当优化器考虑索引扩展时,它将k_d视为(d,i1,i2)。在这种情况下,它可以使用最左侧的索引前缀(d,i1)来生成更好的执行计划:

image.png

在这两种情况下,key都表示优化器使用了辅助索引k_d,但EXPLAIN输出显示了使用扩展索引后的这些改进:
key_len从4个字节变为8个字节,表示键查找使用列d和i1,而不仅仅是d。
ref值从const变为const,const是因为键查找使用了两个键部分,而不是一个。
行数从5减少到1,表明InnoDB需要检查更少的行来产生结果。
Extra值从Using where更改为;using index。这意味着可以仅使用索引读取行,而无需查询数据行中的列。
使用扩展索引的优化器行为的差异也可以在SHOW STATUS中看到:

image.png

前面的语句包括FLUSH TABLES和FLUSH STATUS,用于刷新表缓存和清除状态计数器。
如果没有索引扩展,SHOW STATUS会产生以下结果:

image.png

使用索引扩展,SHOW STATUS会产生此结果。Handler_read_next值从5减小到1,表示更有效地使用索引:
image.png

optimizer_switch系统变量的use_index_extensions标志允许控制优化器在确定如何使用InnoDB表的辅助索引时是否考虑主键列。默认情况下,use_index_extensions处于启用状态。要检查禁用索引扩展是否会提高性能,请使用以下语句:

image.png

优化器对索引扩展的使用受到索引中关键部分数量(16)和最大密钥长度(3072字节)的通常限制。

备注: select_type type ref 关键字意义参考表格 “EXPLAIN Output Columns”, 前面分享中有详细展示,也可见下面表格

image.png

image.pngimage.png

相关文章
|
数据采集 运维 算法
大数据项目管理:从需求分析到成果交付的全流程指南
【4月更文挑战第9天】本文介绍了大数据项目从需求分析到成果交付的全过程,包括需求收集与梳理、可行性分析、项目规划、数据准备与处理、系统开发与集成,以及成果交付与运维。文中通过实例展示了如何进行数据源接入、数据仓库建设、系统设计、算法开发,同时强调了需求理解、知识转移、系统运维的重要性。此外,还提供了Python和SQL代码片段,以说明具体技术实现。在大数据项目管理中,需结合业务和技术,灵活运用这些方法,确保项目的成功执行和价值实现。
3571 1
|
监控 关系型数据库 MySQL
innodb_buffer_pool_instances 如何根据cpu和内存进行配置
`innodb_buffer_pool_instances` 是用于配置 InnoDB 缓冲池实例数的参数。每个实例都管理缓冲池的一部分,这有助于提高并发性能。通常,你可以根据系统的 CPU 和内存来调整这个参数,以获得更好的性能。 以下是一些建议和步骤,帮助你根据 CPU 和内存进行 `innodb_buffer_pool_instances` 的配置: 1. **了解系统资源:** 首先,了解系统的硬件资源,特别是内存和CPU。检查系统上可用的物理内存和 CPU 核心数量。 2. **考虑每个实例的大小:** 在配置 `innodb_buffer_pool_instances` 时,
686 0
|
12月前
|
存储 Java
几种锁:偏向锁、轻量级锁、重量级锁、自旋锁
**锁机制简介:** Java中,锁分为偏向锁、轻量级锁和重量级锁。偏向锁适用于单一线程多次获取同一锁的情况,减少无竞争下的性能消耗;轻量级锁在多线程竞争时通过自旋避免阻塞,提升效率;重量级锁则是在自旋超时或多个线程竞争时,将其他线程阻塞以防止CPU空转,但性能较低。锁的升级路径为:偏向锁 → 轻量级锁 → 重量级锁,且不可降级。偏向锁默认开启,可通过JVM参数调整或关闭。
483 13
几种锁:偏向锁、轻量级锁、重量级锁、自旋锁
|
Shell 分布式数据库 Hbase
如何使用 HBase Shell 进行数据的批量导入和导出?
如何使用 HBase Shell 进行数据的批量导入和导出?
1049 5
|
JavaScript 前端开发 NoSQL
技术好文:Redash(开源轻量级智能)生产环境部署及实践(withoutdocker)
Redash(开源轻量级智能)生产环境部署及实践(withoutdocker)
1036 0
|
缓存 NoSQL 数据库
缓存穿透、缓存击穿和缓存雪崩及其解决方案
在现代应用中,缓存是提升性能的关键技术之一。然而,缓存系统也可能遇到一系列问题,如缓存穿透、缓存击穿和缓存雪崩。这些问题可能导致数据库压力过大,甚至系统崩溃。本文将探讨这些问题及其解决方案。
|
存储 SQL 关系型数据库
多线程线程安全问题之什么是锁的粒度,减少锁的粒度有哪些好处
多线程线程安全问题之什么是锁的粒度,减少锁的粒度有哪些好处
|
程序员
程序员必知:Word设置标题以及多级自动编号——保姆级教程
程序员必知:Word设置标题以及多级自动编号——保姆级教程
650 0
|
缓存 前端开发 Java
java项目接口重复提交解决方案
java项目接口重复提交解决方案
509 0