我有一个查询,大致如下:
SELECT * FROM table1
WHERE confirmed = 0
AND resource = 123
AND id IN (
SELECT id FROM table2 WHERE resource = 123
AND added > 1440000000
)
运行需要将近 3 分钟,但我不知道为什么。这就是我感到困惑的原因......
SELECT id FROM table2 WHERE resource = 123
AND added > 1440000000
此子查询没有结果。一个都没有。所以,我想如果我这样做:
SELECT * FROM table1
WHERE confirmed = 0
AND resource = 123
AND id IN (
0
)
它应该花费大约相同的时间来运行。除了它没有 - 它立即按预期返回 0 个结果。这是怎么回事?将空查询结果与 0 进行比较有什么不同?
行数也很低。我运行了一个解释,它使用表 1 的确认键和表 2 的主键。行数分别为 5500/20000。
如有任何想法,我们将不胜感激!谢谢!
最佳答案
使用显式join
,您的查询会运行得更快。如果子查询不返回重复值:
SELECT t1.*
FROM table1 t1 JOIN
(SELECT id FROM table2 WHERE resource = 123 AND added > 1440000000
) t2
ON t1.id = t2.id
WHERE confirmed = 0 AND resource = 123;
此外,MySQL 通常可以更好地优化 NOT EXISTS
:
SELECT t1.*
FROM table1 t1
WHERE confirmed = 0 AND resource = 123 AND
NOT EXISTS (SELECT 1
FROM table2 t2
WHERE t2.id = t1.id AND t2.resource = 123 AND t2.added > 1440000000
);
使用 table2(id, resource, added)
上的索引,此查询将运行得更快。
关于MySQL 慢 SELECT 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33083082/