JOIN查询是否比多个查询快?(运行主查询,然后根据主查询的结果运行许多其他select)
我这么问是因为加入它们会使我的应用程序的设计复杂化
如果它们快了,有人能大致估计出快了多少吗?如果是1.5倍,我不在乎,但如果是10倍,我就在乎。
JOIN查询是否比多个查询快?(运行主查询,然后根据主查询的结果运行许多其他select)
我这么问是因为加入它们会使我的应用程序的设计复杂化
如果它们快了,有人能大致估计出快了多少吗?如果是1.5倍,我不在乎,但如果是10倍,我就在乎。
当前回答
就吞吐量而言,它会更快吗?可能。但它也可能一次锁定更多的数据库对象(取决于您的数据库和模式),从而降低并发性。根据我的经验,人们经常被“更少的数据库往返”的说法所误导,而在现实中,在大多数OLTP系统中,数据库位于同一个LAN上,真正的瓶颈很少是网络。
其他回答
这里有100个有用的查询链接,这些都是在Oracle数据库中测试的,但记住SQL是标准的,Oracle, MS SQL Server, MySQL和其他数据库之间的区别是SQL方言:
http://javaforlearn.com/100-sql-queries-learn/
这个问题很老了,但是缺少一些基准。我对比了JOIN的两个竞争对手:
N + 1查询 2个查询,第二个查询使用WHERE IN(…)或等价的
结果很明显:在MySQL上,JOIN要快得多。N+1个查询会大大降低应用程序的性能:
也就是说,除非您选择了大量指向极少数不同的外部记录的记录。下面是极端情况下的基准测试:
在典型的应用程序中,这种情况不太可能发生,除非您正在连接一对多的关系,在这种情况下,外键在另一个表上,并且您多次复制主表数据。
导读:
对于*对1关系,总是使用JOIN 对于*对多的关系,第二个查询可能更快
更多信息请参阅我在Medium上的文章。
就吞吐量而言,它会更快吗?可能。但它也可能一次锁定更多的数据库对象(取决于您的数据库和模式),从而降低并发性。根据我的经验,人们经常被“更少的数据库往返”的说法所误导,而在现实中,在大多数OLTP系统中,数据库位于同一个LAN上,真正的瓶颈很少是网络。
这太模糊了,不能给你一个与你的具体情况相关的答案。这取决于很多因素。Jeff Atwood(这个网站的创始人)确实写过这个。不过,在大多数情况下,如果你有正确的索引,并且正确地执行join,那么执行一次旅行通常比执行几次旅行要快。
做了一个快速测试,从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)会产生类似的结果。