栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

mysql覆盖索引

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

mysql覆盖索引

1、简单介绍

select的数据列只用从索引中就能够取得,不必读取其他数据行,MySQL可以利用索引返回select列表中的字段,这样存储引擎获取对应行就可以返回结果,而不必根据索引再次回表读取数据文件。

覆盖索引优化涉及有以下几点:

    • 覆盖索引可以一次性完成查询工作,有效减少IO,提高查询效率;
    • 使用覆盖索引,只需要从索引中就能检索到需要的数据,而不要再扫描数据表(索引为select 列);
    • 索引的体量往往要比数据表小很多,因此只读取索引速度会非常快,也会极大减少数据访问量;
    • MySQL的查询优化器会在执行查询前判断,是否有一个索引可以覆盖所有的查询列,若存在则无需根据索引再次回表读取数据文件;
    • 并非所有类型的索引都可以作为覆盖索引,覆盖索引必须要存储索引列的值。像哈希索引、空间索引、全文索引等并不会真正存储索引列的值
    • 不适用于需要查询多个列数据的场景;在查询列较少的情况下,使用覆盖索引可以明显提升

判断是否使用了覆盖索引:当一个查询所查询的列都在索引字段上,且在查询分析器EXPLAIN的Extra列可以看到“Using index” ,则可判定为覆盖索引。

注:遇到以下情况,执行计划不会选择覆盖查询
1.select选择的字段中含有不在索引中的字段 ,即索引没有覆盖全部的列。
2.where条件中不能含有对索引进行like的操作。

EXPLAIN的Extra列

using index:出现这个说明mysql使用了覆盖索引,避免访问了表的数据行,效率高。

using where:这说明服务器在存储引擎收到行后将进行过滤。有些where中的条件会有属于索引的列,当它读取使用索引的时候,就会被过滤,所以会出现有些where语句并没有在extra列中出现using where这么一个说明。

using temporary:这意味着mysql对查询结果进行排序的时候使用了一张临时表。

using filesort:这个说明mysql会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取。

2、实例

twin_waybill_center_reverse_back表包含以下索引,其中框出来的为组合索引:

explain select id,org_code from twin_waybill_center_reverse_back;
explain select id,org_name from twin_waybill_center_reverse_back;

id、org_code都在索引中,org_name不在索引中。从Extra中得出第一个语句走了覆盖索引,第二个则没有。

执行效率对比:

3、总结

当一条查询语句符合覆盖索引条件时,sql只需要通过索引就可以返回查询所需要的数据,这样避免了查到索引后再返回表操作,提高效率。

这里的索引指表中的索引,只要是建了索引的列都包含,而非特指where后的字段索引。

因此将select id修改为 select org_code 是多余操作。因为这2个字段都在索引中。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/975574.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号