运行EXPLAIN时,如果key的字段值不为null但Extra为空,是否使用了密钥?

时间:2012-11-26 01:11:53

标签: mysql

在没有索引的情况下运行此EXPLAIN查询

EXPLAIN SELECT exec_date,
    100 * SUM(CASE WHEN cached = 'no' THEN 1 ELSE 0 END)  / SUM(1) cached_no,
    100 * SUM(CASE WHEN cached != 'no' THEN 1 ELSE 0 END)  / SUM(1) cached_yes
FROM requests
GROUP BY exec_date

这是输出

id  select_type table       type    possible_keys   key     key_len ref     rows    Extra
1   SIMPLE      requests    ALL     NULL            NULL    NULL    NULL    478619  Using temporary; Using filesort

如果我创建索引

ALTER TABLE requests ADD INDEX exec_date(exec_date);

输出

id  select_type table       type    possible_keys   key         key_len ref     rows    Extra
1   SIMPLE      requests    index   NULL            exec_date   4       NULL    497847  

由于Extra的值为空,这是否意味着未使用密钥exec_date

在测试服务器上,使用和不使用索引的实际(不是EXPLAIN语句)查询的执行时间是相同的。

1 个答案:

答案 0 :(得分:4)

Using index并不代表您认为的含义。如果它出现在Extra列中,则表示优化程序实际上并未读取整个行,而是使用索引(排他地)查找列信息。

该密钥仍可用于其他内容,例如,如果您有WHERE子句,则执行查找等。在您的特定方案中,例如Using temporary;实际上消失了表示正在使用您的索引,因为MySQL不再需要将表的内容重新排列到新的临时表中以执行GROUP BY