执行计划中,key有值,并且type=index,这时候很多人认为是走了索引的。
当我们执行执行计划查看一个SQL的执行过程的时候,通常会见到以下这样的执行计划:
+----+-------+---------------+----------+--------------------------+
| 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
意味着进行了全索引扫描, 会遍历索引树来查找匹配的行,这个效率比扫表扫描快一些,但是很有限,和我们通常意义上理解的走了索引 是两回事儿。
遇到这种情况,大概率是因为没有遵守最左前缀匹配导致的索引失效了。所以需要调整查询语句,或者修改索引来解决。