在我的上一篇文章《功能测试也可以发现数据库相关的性能问题》中提到,通过SQL语句的执行计划可以断定一些语句肯定有性能问题,今天再写一篇文章,介绍一下执行计划中索引使用的情况。
执行explain之后结果集包含如下信息:
possible_keys:指出MySQL能使用哪个索引在表中找到记录,查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询使用(该查询可以利用的索引,如果没有任何索引显示NULL)
key:显示MySQL实际决定使用的键(索引),一般会情况会包含在possible_keys中,如果没有选择索引,键是NULL。
possible_keys和key产生的情况可能有以下几种:
1)possible_keys有多个值,key得值为possible_keys中的一个。
2)possible_keys有一个值,key的值和possible_keys中的值相同。
3)possible_keys有一个或多个值,但key为NULL。
4)possible_keys为NULL,但key有值。
5)possible_keys和key都为NULL。
下面我们分别来看下各种情况。
1. possible_keys有多个值,key得值为possible_keys中的一个。
这种情况比较常见,因为每条sql最多只能用到一个索引。下面的例子我们在col1字段上创建了一个单独索引和一个复合索引,所以possible_keys有两个,但key只有一个。
2. possible_keys有一个值,key的值和possible_keys中的值相同。在上面的基础上,我们删掉任意一个索引。结果如下:
3. possible_keys有一个或多个值,但key为NULL。下图中,因为col1为varchar类型,但是查询的时候没有加上引号
4. possible_keys为NULL,但key有值。这种一般是引用了覆盖索引的情况,col1,col2和col3两列加过联合索引,select的字段不是*,而是col1和col2,所以结果只会出现在key这一列中。
5. possible_keys和key都为NULL,我们直接看下面的例子