【发布时间】:2014-02-06 06:08:54
【问题描述】:
我有 2 个查询应该产生完全相同的结果集
第一个查询:
SELECT *
FROM rms_tests where Id in (SELECT TestId
FROm rms_test_results
where RegressionResultID = 106967
and Failed is NULL);
第二次查询:
SELECT t.*
FROM rms_test_results tr
LEFT JOIN rms_tests t ON tr.testid=t.id
where tr.regressionresultId = 106967
and tr.failed is NULL;
但是第二个需要 0.008 秒,而第一个从未完成并挂起我的“MySQL 查询浏览器”。
SQL 如何评估导致它们崩溃并永远挂起浏览器的第一类查询。
注意:rms_test_results 非常大,比 rms_tests 大很多倍。 也如您所见,它们与 rms_tests.id = rms_test_result.testid 相关
对不起,如果这在某处被覆盖。
++++++++++++++++++++++++++++++++++++++++++++++++ 附言 我真的很困惑,因为如果我将查询 #1 分成两个并一个接一个地执行它们,它们也不会花时间:
SELECT TestId FROm rms_test_results 其中 RegressionResultID = 106967 并且 Failed 为 NULL; SELECT * FROM rms_tests where Id in (1234,1235,.....);
【问题讨论】:
-
您可以使用
EXPLAIN EXTENDED了解 MySQL 如何优化查询。 -
顺便说一下,这两个查询并不等价。
-
@ypercube 你能解释一下有什么区别以及它如何影响“执行计划”。谢谢
-
我的错,我重读了第二个查询。它们实际上是等价的(您可以将
LEFT JOIN替换为 simle (INNER)JOIN,这将是相同的结果。像第一个查询一样用IN (SELECT ...)编写的半联接通常在 MySQL 5.5 和以前的版本中没有得到很好的优化,尤其是如果第二个表(在您的情况下为rms_test_results)很大。
标签: mysql