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

use*_*637 4 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
Run Code Online (Sandbox Code Playgroud)

这是输出

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
Run Code Online (Sandbox Code Playgroud)

如果我创建一个索引

ALTER TABLE requests ADD INDEX exec_date(exec_date);
Run Code Online (Sandbox Code Playgroud)

输出是

id  select_type table       type    possible_keys   key         key_len ref     rows    Extra
1   SIMPLE      requests    index   NULL            exec_date   4       NULL    497847  
Run Code Online (Sandbox Code Playgroud)

既然 的值为Extra空,是否意味着该密钥exec_date未被使用?

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

Asa*_*din 5

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

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