MySQL索引优化:覆盖索引与联合索引的奥秘解析

创始人
2024-12-17 09:03:50
0 次浏览
0 评论

mysql的覆盖索引和联合索引的区别在哪里?

覆盖索引和联合索引的区别主要在于设计和实现方法上。
覆盖索引的目的是为了优化搜索的性能,避免检索查询表,使得查询操作只需要遍历一次索引结构即可获得搜索结果。
链接列表将多个列组合为一个列表,允许查询使用任何列。
接下来,我们将详细分析该清单涵盖的场景的实现和应用。
首先,了解tableau查询返回的概念。
当查询条件使用非主键列(辅助索引)时,就会出现回表查询。
这次,系统首先通过辅助索引找到主键值,然后再次返回主键索引(聚集索引)。
以按顺序获取所有信息。
这会导致额外的I/O操作并降低查询效率。
为了获得更好的性能,引入包络索引很重要。
覆盖索引允许从索引中获取查询结果,而不需要立即检索查询表,从而显着减少查询时间。
实现索引覆盖的关键是修改查询语句,使返回的结果只包含查询所需的列。
例如,仅返回第一个键列,并避免不必要的列。
在实际应用中,覆盖索引通常是通过创建联合索引来实现的。
链接索引将多个列组合成单个索引结构,这样就可以在不访问数据表的情况下对索引执行查询操作。
例如,如果查询语句只需要主键和辅助列的数据,则创建连接索引(年龄、姓名)可以满足需求并优化查询性能。
换行列表最常见的用例包括:1.**列搜索优化**:当查询操作只需要访问某些列时,可以避免从单个列列表向上查找包含所需列的连接列表,以及避免查询后面的表。
更好的查询效率。
2.**计算全表查询:执行全表计算查询时,如果只关注某些列的值,创建这些列的联合索引可以减少必要的I/O操作,提高查询性能。
3、**优化查询分页**:查询分页时,如果分页操作使用的列不属于列表,通常需要进行回表查询,从而影响性能。
通过为查询列创建联合索引,可以实现索引覆盖,减少返表操作,提高搜索效率。
综上所述,索引和链接索引在数据库优化中发挥着重要作用。
了解关键场景和应用场景对于数据库管理员和做出改进系统的决策至关重要。

回表查询与索引覆盖

首先我们需要从InnoDB索引的实现开始InnoDB有两种类型的索引:1.聚集索引(clusteredindex)2.普通索引,也叫二级索引(secondaryindex)

普通索引叶子节点存储的是索引字段值和主键值,不是完整的行记录。

上图展示了它们在索引中的存储状态:(1)聚集索引的叶子节点存储了行的整条记录。
(2)普通索引只存储name字段值和ID值。

MySQL没有正式定义这个,但是有一个概述:只需传递一个索引树即可获取SQL所需的列数据,而无需返回表。
再次选择上表,但是将我们的sql改为:selectid,namefromtwherename='lisi';,查看解释计划:

可以看到已经到了name索引,索引中存放的是id和name,所以Extra元素的值为Usingindex。
您不需要查询该表。
符合索引覆盖率,效率高。

可以看到name索引也到达了,但是索引叶子节点并没有存储性别字段的值,所以Extra元素的值为Usingindexcondition并且必须返回到表中。
查询通过聚集索引获取性别值,不满足索引覆盖率,效率相对较低。
解决方案是将姓名索引改为姓名和性别组合索引,这样第二条SQL查询也满足索引覆盖率要求。

热门文章
1
SQL2000数据库备份压缩技巧:优化空... 怎么将SQL2000中的较大的备份数据库压缩变小更改数据库属性-选项-恢复模型很...

2
高效掌握:CMD命令轻松启动、关闭及登录... 如何用cmd命令快速启动和关闭mysql数据库服务开发中经常使用MySQL数据库...

3
SQL字符串处理技巧:单引号使用与转义标... SQL语句中,字符串类型的值均使用什么符号标明?单引号如果字符串内有单引号,请小...

4
Windows环境下Redis安装指南与... redis安装windowsredis基本简介与安装安装Redis首先需要获取安...

5
深度解析:Redis性能优势与局限性,助... redis有哪些优缺点?Redis的全称是RemoteDictionary.Se...

6
深入解析:MySQL数据库的特性与应用 mysql是什么MySQL是一个关系数据库管理系统。MySQL是一个开源关系数据...

7
Linux Redis后台启动教程:配置... linux怎么启动redis1、首先,为了管理方便,将Redis文件中的conf...

8
MySQL浮点数与Decimal类型详解... MySQL中的float和decimal类型有什么区别小数类型可以准确地表示非常...

9
C语言实现输入10个整数并找出最大最小值... C语言从键盘输入任意的10个整数,从中找出最大值和最小值并输出代码:#inclu...

10
揭秘MySQL:为何将可重复读设为默认事... mysql默认的事务隔离级别是READUNCOMMITTED(未提交读)、REA...