我想问一个关于数据库查询的问题。在查询的情况下,例如查询的where子句来自另一个查询。例如
select ? from ? where ? = select ? from ?
这是一个简单的例子,因此很容易写出来。但对于更复杂的情况,我想知道在性能方面最好的方法是什么。加入?单独查询?嵌套还是其他?
谢谢你的回答。
最诚挚的问候。
答案 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;