我试图了解使用 MySQL 的 SQL 查询的性能。只有 PK 上的索引,查询未能在 10 多分钟内完成。我已经在 where 子句(时间戳、主机名、路径、类型)中使用的所有列上添加了索引,现在查询在大约 50 秒内完成——但是对于看起来不太复杂的查询来说,这似乎仍然需要很长时间。
所以,我想了解导致这种情况的查询是什么。我的假设是我的内部子查询在某种程度上导致了必要比较次数的爆炸式增长。
涉及到两个表:
存储(约 5,000 行 / 4.6MB)和机器(12 行,<4k)
查询如下:
SELECT T.hostname, T.path, T.used_pct,
T.used_gb, T.avail_gb, T.timestamp, machines.type AS type
FROM storage AS T
JOIN machines ON T.hostname = machines.hostname
WHERE timestamp = ( SELECT max(timestamp) FROM storage AS st
WHERE st.hostname = T.hostname AND
st.path = T.path)
AND (machines.type = 'nfs')
ORDER BY used_pct DESC
查询的 EXPLAIN EXTENDED 返回以下内容:
id select_type table type possible_keys key key_len ref rows filtered Extra
1 PRIMARY machines ref hostname,type type 768 const 1 100.00 Using where; Using temporary; Using filesort
1 PRIMARY T ref fk_hostname fk_hostname 768 monitoring.machines.hostname 4535 100.00 Using where
2 DEPENDENT SUBQUERY st ref fk_hostname,path path 1002 monitoring.T.path 648 100.00 Using where
注意到第 1 行的“额外”列包括“使用文件排序”和问题: MySQL 解释查询理解 指出“使用文件排序是一种排序算法,其中 MySQL 无法使用索引进行排序,因此无法执行在内存中完成排序。”
这个查询的性质是什么导致性能下降?
为什么 MySQL 必须为此查询使用“文件排序”?