【问题标题】:How does SQL evaluate nested queries? Why are joins so much better if they mean the same thingSQL 如何评估嵌套查询?如果它们的含义相同,为什么连接会更好
【发布时间】: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


【解决方案1】:

联接通常可以利用更有效的“执行计划”,而嵌套查询或“子查询”通常不能。

延伸阅读:Join vs. sub-query

【讨论】:

  • 执行计划是用于描述所有查询路径的术语;他们是否使用明确的JOIN
  • @Sev09 你说的不正确。除了 FreshPrice 指出什么是执行计划之外,有时子查询和派生表会导致更有效的执行计划。
  • @ypercube,一定是W3学校教育展。 ;)
  • 加油,不要对自己太苛刻。我建议你编辑答案,这样它就不是硬连线了。说 “连接通常利用...”“...子查询经常导致计划效率低下”。您还可以搜索并查看最近版本的 MySQL(5.6 和 MariaDB 5.5)中这种(处理子查询的方式)是如何改变的,它通常可以从子查询中“拉出”表,就好像查询是在没有子查询的情况下编写的一样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-18
  • 1970-01-01
  • 2022-11-30
  • 1970-01-01
  • 2021-12-09
  • 1970-01-01
  • 2012-10-29
相关资源
最近更新 更多