一、啥是覆盖索引
覆盖索引就是在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索引做覆盖索引。另外,不同的存储引擎实现覆盖索引的方式也不同,而且不是所有的引擎都支持覆盖索引。