在没有索引的情况下运行此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
语句)查询的执行时间是相同的。
答案 0 :(得分:4)
Using index
并不代表您认为的含义。如果它出现在Extra
列中,则表示优化程序实际上并未读取整个行,而是使用索引(排他地)查找列信息。
该密钥仍可用于其他内容,例如,如果您有WHERE
子句,则执行查找等。在您的特定方案中,例如Using temporary;
实际上消失了表示正在使用您的索引,因为MySQL不再需要将表的内容重新排列到新的临时表中以执行GROUP BY
。