主题
面试速答(先看这里)
**一句话结论:**这个执行计划中, 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」:底层原理是什么?使用时有哪些边界和常见坑?
- 如果线上出现异常,你会如何定位、验证并规避?
典型回答
执行计划中,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 意味着进行了全索引扫描, 会遍历索引树来查找匹配的行,这个效率比扫表扫描快一些,但是很有限,和我们通常意义上理解的走了索引 是两回事儿。
遇到这种情况,大概率是因为没有遵守最左前缀匹配导致的索引失效了。所以需要调整查询语句,或者修改索引来解决。