JOIN查询是否比多个查询快?(运行主查询,然后根据主查询的结果运行许多其他select)
我这么问是因为加入它们会使我的应用程序的设计复杂化
如果它们快了,有人能大致估计出快了多少吗?如果是1.5倍,我不在乎,但如果是10倍,我就在乎。
JOIN查询是否比多个查询快?(运行主查询,然后根据主查询的结果运行许多其他select)
我这么问是因为加入它们会使我的应用程序的设计复杂化
如果它们快了,有人能大致估计出快了多少吗?如果是1.5倍,我不在乎,但如果是10倍,我就在乎。
当前回答
就吞吐量而言,它会更快吗?可能。但它也可能一次锁定更多的数据库对象(取决于您的数据库和模式),从而降低并发性。根据我的经验,人们经常被“更少的数据库往返”的说法所误导,而在现实中,在大多数OLTP系统中,数据库位于同一个LAN上,真正的瓶颈很少是网络。
其他回答
这太模糊了,不能给你一个与你的具体情况相关的答案。这取决于很多因素。Jeff Atwood(这个网站的创始人)确实写过这个。不过,在大多数情况下,如果你有正确的索引,并且正确地执行join,那么执行一次旅行通常比执行几次旅行要快。
是的,使用join的查询会更快。虽然不知道要查询的表之间的关系、数据集的大小或主键的位置,但几乎不可能说速度有多快。
为什么不把这两种情况都测试一下,然后你就会确定……
这个问题很老了,但是缺少一些基准。我对比了JOIN的两个竞争对手:
N + 1查询 2个查询,第二个查询使用WHERE IN(…)或等价的
结果很明显:在MySQL上,JOIN要快得多。N+1个查询会大大降低应用程序的性能:
也就是说,除非您选择了大量指向极少数不同的外部记录的记录。下面是极端情况下的基准测试:
在典型的应用程序中,这种情况不太可能发生,除非您正在连接一对多的关系,在这种情况下,外键在另一个表上,并且您多次复制主表数据。
导读:
对于*对1关系,总是使用JOIN 对于*对多的关系,第二个查询可能更快
更多信息请参阅我在Medium上的文章。
实际上,我自己也在寻找这个问题的答案,在阅读了给出的答案后,我只能同意比较DB查询性能的最佳方法是获得真实世界的数字,因为有太多的变量需要考虑,但是,我也认为比较它们之间的数字在几乎所有情况下都不会有好的结果。我的意思是,这些数字应该始终与一个可接受的数字进行比较,而绝对不是相互比较。
我可以理解,如果一种查询方式需要0.02秒,而另一种需要20秒,这是一个巨大的差异。但是,如果一种查询方式需要0.0000000002秒,而另一种需要0.0000002秒呢?在这两种情况下,一种方式比另一种方式快1000倍,但在第二种情况下,它真的仍然“惊人”吗?
就我个人而言,底线是:如果它表现良好,就寻求简单的解决方案。
有几个因素,这意味着没有二元答案。什么对性能最好取决于您的环境。顺便说一下,如果带有标识符的单个选择不是次秒级的,那么您的配置可能有问题。
真正要问的问题是您希望如何访问数据。单个选择支持后期绑定。例如,如果您只想要员工信息,您可以从Employees表中进行选择。外键关系可用于在以后根据需要检索相关资源。选择已经有一个键指向,所以它们应该非常快,你只需要检索你需要的。必须始终考虑到网络延迟。
联接将一次检索所有数据。如果您正在生成一个报告或填充一个网格,这可能正是您想要的。在这种情况下,编译和优化的连接将比单一选择更快。请记住,Ad-hoc连接可能没有那么快——您应该将它们编译(到存储的proc中)。速度取决于执行计划,该计划详细说明了DBMS检索数据所采取的步骤。