Skip to content

面试速答(先看这里)

**一句话结论:**这个执行计划中, type=index,key=idx_abcd 很多人会认为这表示这条SQL走了索引,但是其实这么理解是不对的。

60秒标准回答:

执行计划中,key有值,并且type=index,这时候很多人认为是走了索引的

当我们执行执行计划查看一个SQL的执行过程的时候,通常会见到以下这样的执行计划

这个执行计划中, type=index,key=idx_abcd 很多人会认为这表示这条SQL走了索引,但是其实这么理解是不对的

**答题顺序:**结论 → 原理/机制 → 关键流程 → 场景与取舍 → 易错点

回答主线:

  • **要点1:**执行计划中,key有值,并且type=index,这时候很多人认为是走了索引的。
  • **要点2:**当我们执行执行计划查看一个SQL的执行过程的时候,通常会见到以下这样的执行计划:
  • **要点3:**如果是走了索引Extra中的内容应该是 Using index 而不是 Using where; Using index
  • **要点4:**以上的这个执行计划表明,这个SQL确实用到了idx_abcd的这个索引树,但是他并没有直接通过索引进行匹配或者范围查询,而是扫描了整颗索引树。
  • **要点5:**所以, type=index 意味着进行了全索引扫描, 会遍历索引树来查找匹配的行,这个效率比扫表扫描快一些,但是很有限,和我们通常意义上理解的 走了索引 是两回事儿。

**记忆锚点:**index → Using → type → key → SQL → idx_abcd

加分表达:

  • 如果是走了索引Extra中的内容应该是 Using index 而不是 Using where; Using index 以上的这个执行计划表明,这个SQL确实用到了idx_abcd的这个索引树,但是他并没有直接通过索引进行匹配或者范围查询,而是扫描了整颗索引树。

追问准备:

  • 围绕「index」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「Using」:底层原理是什么?使用时有哪些边界和常见坑?
  • 围绕「type」:底层原理是什么?使用时有哪些边界和常见坑?
  • 如果线上出现异常,你会如何定位、验证并规避?

典型回答 ​

📄 ✅SQL执行计划分析的时候,要关注哪些信息?

打开文档:✅SQL执行计划分析的时候,要关注哪些信息?

执行计划中,key有值,并且type=index,这时候很多人认为是走了索引的。

当我们执行执行计划查看一个SQL的执行过程的时候,通常会见到以下这样的执行计划:

plain
+----+-------+---------------+----------+--------------------------+                                           
| id | type  | possible_keys | key      | Extra                    |                                           
+----+-------+---------------+----------+--------------------------+                                           
|  1 | index | NULL          | idx_abcd | Using where; Using index |                                           
+----+-------+---------------+----------+--------------------------+

这个执行计划中,type=index,key=idx_abcd很多人会认为这表示这条SQL走了索引,但是其实这么理解是不对的。

如果是走了索引Extra中的内容应该是Using index 而不是Using where; Using index

以上的这个执行计划表明,这个SQL确实用到了idx_abcd的这个索引树,但是他并没有直接通过索引进行匹配或者范围查询,而是扫描了整颗索引树。

所以,type=index 意味着进行了全索引扫描, 会遍历索引树来查找匹配的行,这个效率比扫表扫描快一些,但是很有限,和我们通常意义上理解的走了索引 是两回事儿。

遇到这种情况,大概率是因为没有遵守最左前缀匹配导致的索引失效了。所以需要调整查询语句,或者修改索引来解决。