JOIN查询是否比多个查询快?(运行主查询,然后根据主查询的结果运行许多其他select)

我这么问是因为加入它们会使我的应用程序的设计复杂化

如果它们快了,有人能大致估计出快了多少吗?如果是1.5倍,我不在乎,但如果是10倍,我就在乎。


当前回答

对于内部连接,单个查询是有意义的,因为您只获得匹配的行。 对于左连接,多个查询要好得多……看看下面我做的基准测试:

5个join的单个查询 查询:8.074508秒 结果大小:2268000 一行5个查询 组合查询时间:0.00262秒 结果大小:165 (6 + 50 + 7 + 12 + 90)

.

注意,我们在这两种情况下得到了相同的结果(6 x 50 x 7 x 12 x 90 = 2268000)

左连接使用指数级的冗余数据内存。

如果只连接两个表,内存限制可能没有那么糟糕,但通常是三个或三个以上,因此值得进行不同的查询。

顺便说一句,我的MySQL服务器就在我的应用服务器旁边…所以连接时间可以忽略不计。如果您的连接时间以秒为单位,那么可能会有好处

弗兰克

其他回答

这个问题很老了,但是缺少一些基准。我对比了JOIN的两个竞争对手:

N + 1查询 2个查询,第二个查询使用WHERE IN(…)或等价的

结果很明显:在MySQL上,JOIN要快得多。N+1个查询会大大降低应用程序的性能:

也就是说,除非您选择了大量指向极少数不同的外部记录的记录。下面是极端情况下的基准测试:

在典型的应用程序中,这种情况不太可能发生,除非您正在连接一对多的关系,在这种情况下,外键在另一个表上,并且您多次复制主表数据。

导读:

对于*对1关系,总是使用JOIN 对于*对多的关系,第二个查询可能更快

更多信息请参阅我在Medium上的文章。

是的,使用join的查询会更快。虽然不知道要查询的表之间的关系、数据集的大小或主键的位置,但几乎不可能说速度有多快。

为什么不把这两种情况都测试一下,然后你就会确定……

这里有100个有用的查询链接,这些都是在Oracle数据库中测试的,但记住SQL是标准的,Oracle, MS SQL Server, MySQL和其他数据库之间的区别是SQL方言:

http://javaforlearn.com/100-sql-queries-learn/

做了一个快速测试,从50,000行表中选择一行,并连接100,000行表中的一行。基本上是这样的:

$id = mt_rand(1, 50000);
$row = $db->fetchOne("SELECT * FROM table1 WHERE id = " . $id);
$row = $db->fetchOne("SELECT * FROM table2 WHERE other_id = " . $row['other_id']);

vs

$id = mt_rand(1, 50000);
$db->fetchOne("SELECT table1.*, table2.*
    FROM table1
    LEFT JOIN table1.other_id = table2.other_id
    WHERE table1.id = " . $id);

在我的家用慢速电脑上,two select方法读取50,000次需要3.7秒,而JOIN方法需要2.0秒。INNER JOIN和LEFT JOIN没有区别。获取多行(例如,使用IN SET)会产生类似的结果。

有几个因素,这意味着没有二元答案。什么对性能最好取决于您的环境。顺便说一下,如果带有标识符的单个选择不是次秒级的,那么您的配置可能有问题。

真正要问的问题是您希望如何访问数据。单个选择支持后期绑定。例如,如果您只想要员工信息,您可以从Employees表中进行选择。外键关系可用于在以后根据需要检索相关资源。选择已经有一个键指向,所以它们应该非常快,你只需要检索你需要的。必须始终考虑到网络延迟。

联接将一次检索所有数据。如果您正在生成一个报告或填充一个网格,这可能正是您想要的。在这种情况下,编译和优化的连接将比单一选择更快。请记住,Ad-hoc连接可能没有那么快——您应该将它们编译(到存储的proc中)。速度取决于执行计划,该计划详细说明了DBMS检索数据所采取的步骤。