Skip to main content

浅析覆盖索引

一、啥是覆盖索引

覆盖索引就是在sql查询的时候,利用到的索引已经完全包含需要查询字段的情况,在这种情况下,查询结果直接就是索引的值,并不需要再利用索引回表查询了。

二、覆盖索引的评判标准

使用explain,可以通过输出的extra列来判断,对于一个索引覆盖查询,显示为using index,MySQL查询优化器在执行查询前会决定是否有索引覆盖查询。

三、覆盖索引的优点

  • 1、索引项通常比记录要小,所以MySQL访问更少的数据
  • 2、索引都按值的大小顺序存储,相对于随机访问记录,需要更少的I/O
  • 3、大多数据引擎能更好的缓存索引,比如MyISAM只缓存索引
  • 4、覆盖索引对于InnoDB表尤其有用,因为InnoDB使用聚集索引组织数据,如果二级索引中包含查询所需的数据,就不再需要在聚集索引中查找了

 

四、覆盖索引应用

例1:

mysql> explain select * from users where actor='qk' and title like '%man%';

1. 没有任何的列能够覆盖这个查询,因为查询中选择了所有列,而没有任何索引能覆盖所有的列。

2. MySQL不能再索引中执行LIKE %string%操作,这是底层引擎的API限制。但是可以执行LIKE string%,是可以根据左前缀匹配利用索引,因为该操作可以转换为简单的比较操作。

例2:

mysql> explain select address from users where last_name = 'Andy';

对于这种查询,可以添加一个(last_name,address)索引,这样就可以利用到覆盖所以了,这个SQL优化技巧在实际中很多很常用的。

五、总结

通常大家都会根据查询的WHERE条件来创建合适的索引,不过这只是索引优化的一个方面。
设计优秀的索引应该考虑到整个查询,而不单单是WHERE条件部分。
不是所有类型的索引都可以成为覆盖索引,覆盖索引必须要存储索引列的值,而哈希索引、空间索引和全文索引等都不存储索引列的值,所以mysql只能使用B-Tree索引做覆盖索引。另外,不同的存储引擎实现覆盖索引的方式也不同,而且不是所有的引擎都支持覆盖索引。

发表评论