嵌套查询的性能

时间:2012-01-30 07:44:43

标签: mysql sql database

我想问一个关于数据库查询的问题。在查询的情况下,例如查询的where子句来自另一个查询。例如

select ? from ? where ? = select ? from ?

这是一个简单的例子,因此很容易写出来。但对于更复杂的情况,我想知道在性能方面最好的方法是什么。加入?单独查询?嵌套还是其他?

谢谢你的回答。

最诚挚的问候。

5 个答案:

答案 0 :(得分:1)

你应该测试一下。这些事情很大程度上取决于查询的细节以及它可以使用的索引。

根据我的经验,JOIN往往比MySQL中的嵌套查询更快。在某些情况下,MySQL不是很聪明,并且似乎为外部查询生成的每一行运行子查询。

您可以在官方文档中阅读有关这些内容的更多信息:

优化子查询:http://dev.mysql.com/doc/refman/5.6/en/optimizing-subqueries.html
将子查询重写为连接:http://dev.mysql.com/doc/refman/5.6/en/rewriting-subqueries.html

答案 1 :(得分:1)

这取决于案例。如果您在内部查询中得到的结果非常少,那么您应该选择它。流程的工作方式是首先执行内部查询,然后在外部查询中使用结果集。 同时加入给你一个笛卡尔积,这又是一个繁重的操作。

答案 2 :(得分:0)

正如米奇和乔尼所说,这取决于。但通常情况下,加入会提供最佳性能。您试图避免为外部查询的每一行运行嵌套查询。一个好的查询优化器无论如何都可以为你做这件事,通过解释你想要做的事情并基本上“修复”你的错误。但是对于绝大多数查询,您应该首先将其编写为连接。这样你就可以明确自己正在做什么,并且完全了解自己正在做什么,以及最有效的工作方式是什么。

答案 3 :(得分:0)

我期望连接更快,主要是因为你有一个等价和一个显式的JOIN。仍然使用解释来看看SQl引擎如何解释它们的差异 我不希望它们如此不同,当您使用相关子查询时,使用连接而不是子查询可以获得真正的,大的性能提升。

答案 4 :(得分:0)

因为几乎所有人都说连接会提供最佳性能,我只是登录以说出我所遇到的完全相反的体验。

所以有些日子我正在为3-4张表写一个查询,这些表有大量的数据。我用连接写了一个大sql查询,执行它需要大约2-3个小时。然后我重新构建它,创建一个嵌套的选择查询,尽可能多地放置嵌套的一个和多个约束。使其尽可能严格,然后性能提高了> 90%,现在运行时间不到4分钟。

这只是我的经验,理论上可能是联接更好。我只想分享我的经验。它更好地尝试不同的东西,获得关于表的额外知识,它的索引等将有很大帮助。

更新:

我刚刚发现我所做的是在MySQL的这个优化参考页面中实际建议的。 http://dev.mysql.com/doc/refman/5.6/en/optimizing-subqueries.html

将其粘贴在此处以供快速参考:

  

用子查询替换连接。例如,试试这个:

     

SELECT DISTINCT column1 FROM t1 WHERE t1.column1 IN(SELECT column1   来自t2);

     

而不是:

     

SELECT DISTINCT t1.column1 FROM t1,t2 WHERE t1.column1 =   t2.column1;

     

将子句从外部移动到子查询内部。例如,使用   这个查询:

     

SELECT * FROM t1 WHERE s1 IN(SELECT s1 FROM t1 UNION ALL SELECT s1   来自t2);而不是这个查询:

     

SELECT * FROM t1 WHERE s1 IN(SELECT s1 FROM t1)或s1 IN(SELECT s1   来自t2);再举一个例子,使用这个查询:

     

SELECT(SELECT column1 + 5 FROM t1)FROM t2;而不是这个查询:

     

SELECT(SELECT column1 FROM t1)+ 5 FROM t2;