3

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语句)查询的执行时间是相同的。

4

1 回答 1

4

Using index并不意味着你认为它意味着什么。如果它存在于Extra列中,则表明优化器实际上并未读取整行,它正在使用索引(专门)来查找列信息。

该键仍可能用于其他用途,例如,如果您有WHERE子句等,则执行查找。例如,在您的特定场景中,实际上的消失Using temporary;确实意味着您的索引正在被使用,因为 MySQL 不再需要将表的内容重新排列到一个新的临时表中以执行GROUP BY.

于 2012-11-26T06:47:45.990 回答