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表包含以下索引,其中框出来的为组合索引:

mysql覆盖索引_第1张图片

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

mysql覆盖索引_第2张图片

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

执行效率对比:

mysql覆盖索引_第3张图片

3、总结

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

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

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

mysql覆盖索引_第4张图片

你可能感兴趣的:(数据库,mysql,数据库,b树)