有个面试题分享给大家: 创建了组合索引 ( A , B , C) 查询条件where C =1 AND A =1 AND B >1,是否用到索引呢?怎么证明? 有关索引介绍及详解,可以参考我的一篇博客: 链接: MySQL索引详解及演进过程以及延申出面试题(别再死记硬背了,跟着我推演一遍吧)
当我们执行查询语句时,在前面加上EXPLAIN便可以查看本次执行的相关信息
里面的字段都有哪些值,分别是都是啥意思呢?
这个其实是 表名 或者显示的别名
const:使用了主键索引,通常只会匹配一行,这种性能是非常高的。 ref:使用了二级索引,如果查询只是用到了最左匹配原则,查询条件列是使用了索引,但是不是使用了主键索引或者是唯一索引 range:使用了索引检索一个范围的数据,意味着这个级别已经走了索引,一般能的达到这个级别就OK。 index:全索引扫描 all:全表扫描 从上往下性能越来越差,我们程序员对于上线的SQL,起码要保证 range,不能保证就建索引,能命中就命中
显示这张表中可能用到的索引
我们实际用到的索引,如果为NULL 就没有用到索引
这些字段中,type,key,extra尤为重要
有时候我们设置了索引,但是查询却不走索引,这是为啥? 这里我总结了常见的原因:
索引失效其实是由于我们索引树存储数据的方式去决定的,使用了某些系统函数,或者是在索引列上做计算,会导致表扫描,使得我们没办法命中我们的索引树,至于到底是否失效,这个跟数据库版本,表内数据的具体情况由我们的的优化器去决定的,我们说了不算,要具体问题,具体分析。