对线面试官 - 如何理解MySQL的索引覆盖和索引下推

上周面试的时候,面试官问我Patrick Star对MySQL索引的理解。
我解释说,覆盖索引就像一张小数据表,里面包含了查询所需的所有数据,这样查询就可以直接从索引中检索,而不需要访问原始数据表,这样可以大大提高搜索效率。
比如我举了个例子,如果查询covering_table表中的key1 字段,当key1 的值为'ketvalue'时,只需要使用idx_key1 _key2 索引即可完成查询,无需回表。

我还提到,使用覆盖索引需要满足匹配联合索引中包含的最左边前缀和查询字段的条件。
如果不满足这些条件,则无法使用该索引。

然后我解释了索引下推的概念。
它是MySQL 5 .6 中引入的一项优化技术。
运行SQL时,一些条件可以直接应用于索引,以减少表返回操作。
例如,如果不使用下推,MySQL将首先查询所有数据,然后进行过滤。
然而,启用下推后,索引可以在过滤阶段使用。

我还注意到,当额外字段显示“Usingindexcondition”时,表示正在使用索引下推。
不过,我补充说,索引下推并不限于 LIKE 关系。
即使对于索引无效的共享索引,只要能通过非聚集索引找到主键,就可以使用下推优化。

最后我解释了表返回的概念。
在InnoDB存储引擎中,当查询非主键索引时,会先找到主键,然后根据主键查询实际数据。
通过优化主键查询,使用覆盖索引和索引压入,可以减少回表次数,提高查询效率。
不过突然想到好像还有其他的优化技巧,只是这部分我不太确定。

一篇文章讲清楚MySQL的聚簇/联合/覆盖索引、回表、索引下推

1 、聚集索引和非聚集索引 聚集索引:在InnoDB引擎下,叶子节点存储全行数据,例如主键索引。
如果没有主键,则会自动创建隐藏主键。
非聚集索引:叶子节点存储索引字段和主键ID,查询时必须返回表。

2 常用指标 定义:由多个字段组成的索引。
字段的顺序影响排序和匹配。
优点:减少扫描的行数,提高查询效率,对于多字段查询效果更好。
最左匹配原则:查询字段的顺序必须与索引或前缀字段的顺序匹配。

3 索引和表返回查询覆盖率 覆盖索引:所有查询字段都在索引中,无需返回表,效率高。
表返回查询:并非所有查询字段都在索引中。
必须先找到主键的ID,然后再返回表,效率低下。

4 指数下推 定义:MySQL 5 .6 功能在索引级别执行更多条件过滤并减少表返回。
优点:减少返回表的行数,提高查询效率,对于多字段查询效果更好。

总结:了解索引类型和特点并正确使用它们可以显着提高查询效率。