概述
- 覆盖索引能够极大地提高性能。 考虑一下如果查询只需要扫描索引而无须回表,会带来多少好处
- 索引的条目通常远小于数据行大小,所以如果只需要读取索引,那极大地减少数据访问量,所以更内容全部放在内存中
- 索引是按照列值顺序存储的(至少单个页内是这样的)
- 一些存储引擎如MyISAM 的内存只缓存索引。
- 由于innodb 的聚簇索引,覆盖索引 对Innodb表特别有用。 Innodb的二级索引在叶子节点中保存了行的主键值,所以如果二级主键能够覆盖查询,则可以避免对主键索引的二次查询
- mysql 只能用b-tree索引来做覆盖索引
- 当发起一个被索引覆盖的查询时,在 EXPLAIN 的extra列可以看到 “Using index”的信息
例子
explain select * from prodcuts where actor = "yeyute" and title like ' %aplollo%';
- 没有任务索引能够覆盖这个查询,因为查询从表中选择了所有的列, 不过 where 条件中的表是有索引可以覆盖的
- mysql 不能在索引中执行like 操作 。 mysql5.5以为更早版本,只允许在索引中做简单操作(> 和 >= 和 != ),这种情况,mysql 只能提取数据行的值而不是索引值来做比较
使用索引扫描来做排序
- explain type列的值为“index”
- 如果索引不能覆盖查询所需的全部列,就得扫描查询所需的全部列
- mysql 可以使用同一个索引既满足排序,又用于查找行
- 关联多表时,只有当order by 子句引用的字段全部为第一个表时,才能使用索引做排序
- 建立(sex,country),查询时不限制性别,可以在查询条件新增 sex in(‘m’,’f’) and country=’’ 来使用索引