通常大家会根据查询的 where 条件来创建合适的索引,不过这只是索引优化的一个方面。设计优秀的索引应该考虑到整个查询,而不单单是 where 条件部分。索引确实是一种查找数据的高效方式,但是 MySQL 也可以使用索引来直接获取列的数据,这样就不再需要读取数据行。如果索引的叶子节点中已经包含要查询的数据,那么还有必要再回表查询吗?如果一个索引包含所有需要查询的字段的值,就称之为 ”覆盖索引”
覆盖索引是非常有用的工具,能够极大的提高性能(减少 IO 操作)。因为,只需要读取索引,而无需读表,极大减少数据访问量
查看方法
explain sql 语句:
extra(use index)有这个说明是覆盖索引
如果索引覆盖了 WHERE 条件中的字段,但不是整个查询涉及的字段
explain sql 语句会得到 extra(use where)
如果没有任何索引能覆盖查询的所有列,那么这个查询就需要回表(就是根据 where 条件重新查询一次数据,然后返回结果)。但是索引还是用到了
使用条件
覆盖索引必须要存储索引列的值,而哈希索引、空间索引和全文索引等都不存储索引列的值,所以 MySQL 只能使用 B-Tree 索引做覆盖索引。并且不同的存储引擎实现覆盖索引都是不同的。并不是所有的存储引擎都支持它们。如果要使用覆盖索引。一定要注意 SELECT 列表值取出需要的列。不可以是 SELECT * ,因为如果将所有字段一起做索引会导致索引文件过大。查询性能下降。不能为了利用覆盖索引而这么做
优点
MySQL 只需要通过索引就可以返回查询所需要的数据,而不必在查到索引之后进行回表操作,减少 IO,提高了效率