回表, 覆盖索引,索引下推简述
首先在innodb引擎下,下图表示主键索引(聚集索引)以及二级索引(非聚集索引)。
主键索引,只会在叶子节点上存储索引列以及所有的数据记录,而非主键索引,只会在叶子节点上存储索引列以及主键的值。
假如做查询select * from where age=18。name 和 age 列 上别有一个 单列索引。
- 回表查询
会首先在二级索引上每 查到一条符合条件 age > 18 的记录时,就到主键索引上,查询这条记录其他列的数据。即所谓的一次回表查询。直到获取所有结果,这种方式对于上面的 SQL 整个执行过程,扫描了 16 条记录,回表 8 次。
- 索引下推
“索引下推”是数据库查询优化中的一种技术,全称是 Index Condition Pushdown(ICP)。它的作用是让数据库在使用索引查找数据时,尽量在索引层面就完成更多的过滤工作,从而减少访问主表(也叫“回表”)的次数,提高查询效率。
- 适用条件
-
使用 复合索引 时最有效;
-
条件中的列必须在 索引中出现;
-
查询条件不能涉及函数或复杂表达式(否则不能下推);
-
MySQL 5.6 及以上版本默认开启了 ICP。
3. 查看是否使用了 ICP
使用 EXPLAIN
查看查询计划,关注 Extra
字段,如果看到 Using index condition
,就说明用了索引下推。索引下推就是让数据库尽量在“查索引”的时候就过滤掉不需要的行,减少回表次数,提升效率。
- 索引覆盖
“索引覆盖”也叫 覆盖索引,英文是 Covering Index,是数据库优化中另一个非常重要的概念。它的核心思想是。查询的数据全部都能从索引中获取,根本不需要回表去主表查。怎么判断是否用了覆盖索引?
使用 EXPLAIN
,看 Extra
字段:
-
如果显示
Using index
,而不是Using where
或Using index condition
,说明这个查询是覆盖索引查询。