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带索引和不带索引的实际(而不是语句)查询的执行时间是相同的。
Using index并不意味着你认为的意思。如果它存在于Extra列中,则表明优化器实际上并未读取整行,而是使用索引(独占)来查找列信息。
该键仍然可以用于其他用途,例如,如果您有子句WHERE等,则执行查找。例如,在您的特定场景中,实际上的消失Using temporary;确实意味着您的索引正在被使用,因为 MySQL 不再需要将表的内容重新排列到新的临时表中以执行GROUP BY.
| 归档时间: |
|
| 查看次数: |
1359 次 |
| 最近记录: |