ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] ## 什么是回表查询? 首先,我们都知道Mysql Innodb索引的叶子节点直接绑定着数据,但实际上只有`主键索引`下,才会绑定所有的数据。还有另外一种`非主键索引`,其下方挂载的数据实际上是主键的id值。 根据非主键索引查询到主键后,再从主键索引中查询其他数据,这个过程就是**回表查询**。 ![](https://img.kancloud.cn/7f/0f/7f0fb27f9cd0ae94d583891cf1a8b891_421x241.png) ## 优化回表查询 优化回表查询的两种方式: - 索引覆盖:基本思路是在非主键索引中增加必要的返回数据,创建联合索引可以解决。 - 索引下推:这是Mysql5.6版本中的一个优化配置,联合索引的后面的字段可以作为搜索条件过滤返回的主键值——目的是返回较少的主键值,从而减少回表次数。 > 索引覆盖、索引下推,都是在非主键索引的基础上优化为联合索引,从而减少回表次数的SQL优化方式。 ### 背景 多查询了一个属性,为何检索过程完全不同? ``` select id,name where name='shenjian' select id,name,sex where name='shenjian' ``` ## 什么是索引覆盖? ## 如何实现索引覆盖? ## 哪些场景,可以利用索引覆盖来优化SQL? ## 什么是索引下推? 索引下推在**非主键索引**上的优化,可以有效减少回表的次数,大大提升了查询的效率。explain解析结果中的Extra值为`Using index condition`。 开启方式: ~~~sql set optimizer_switch='index_condition_pushdown=on'; ~~~