本文是 上一篇 mysql的索引 的续篇,接着我们的
Innodb
引擎的索引实现继续
1. 覆盖索引
1.1. 覆盖索引是什么
当 sql
语句的查询字段(select
列)和查询条件字段(where
子句)全都包含在一个索引中(联合索引),可以直接使用索引查询而不需要回表。这就是覆盖索引
select id,age from user where age = 10;
age
是普通索引,id
是主键索引- 查询的是
id,age
,所以通过普通索引查询的第一步就能得到结果
1.2. 如何实现覆盖索引
常见的方法是:将被查询的字段,建立到复合索引里去
select id,age from user where age = 10;
explain
分析:因为 age
是普通索引,使用到了 age
索引,通过一次扫描 B+ Tree
即可查询到相应的结果,这样就实现了覆盖索引
1.3. 无法实现使用覆盖索引的情况
select id,age,name from user where age = 10;
explain
分析:age
是普通索引,但 name
列不在索引树上,所以通过 age
索引在查询到 id
和 age
的值后,需要进行回表再查询 name
的值
为了实现索引覆盖,需要建复合索引 idx_age_name(age, name)
1.4. 哪些场景适合使用覆盖索引来优化 SQL
1.4.1. 全表 count
查询优化
mysql> create table user