我有两个表
表A(主键为ID)id\firstname\lastname\zip\state
表Bsome_field\business-name\zip\id
我需要使用表B中的id获取与id关联的名字和姓氏(注意,这与表格A的id相同)
我在表a和表B上做了一个JOIN,这样我就可以得到名字和姓氏
我的一个朋友说我不应该以这种方式使用JOIN,我应该只做两个单独的查询。这有道理吗?
JOIN是否会使处理速度慢于两个单独的查询?两个单独的查询怎么会比一个查询快呢?
Q:这有意义吗?
A: 不,如果没有一些正当的理由,这是没有意义的。
Q: JOIN是否做了一些事情,使处理速度比两个单独的查询慢?
A: 是的,有些事情会使连接变慢,所以我们不能排除这种可能性。我们不能笼统地说"两个单独的查询会更快"或"连接会更慢"。
索引正确的两个表的等距可能会更高效。但是,最好通过实际执行语句、以预期的生产数据量以及观察和衡量性能来衡量性能。
有些事情可能会使连接速度变慢。。。复杂的联接谓词(涉及函数中包含的列、不等式比较、与OR
组合的复合谓词、涉及多个表,优化器需要考虑更多的联接路径和操作来制定执行计划。或者,一个生成hugh jass中间结果的联接,该结果后来用GROUP BY折叠。(简而言之,使用联接操作编写一个效率极低的语句是可能的。但罪魁祸首通常是而不是联接操作。这个列表只是一个样本,而不是一个详尽的列表。)
JOIN是您描述的用例的规范模式。目前还不清楚为什么你的朋友建议你避免JOIN操作。你的朋友给出了什么理由。
如果您的主查询主要针对(不幸命名的)Table_B
,并且您想从Table_A
中查找first_name和last_name,那么JOIN就适合这样做。
如果您只从Table_B
返回一行(或几行),那么为另一个查询额外往返获取first_name和last_name就不会有问题。但是,如果从Table_B
返回数千行,那么对Table_A
执行数千个单独的单例查询将扼杀性能和可扩展性。
如果您的朋友担心Table_B
的外键列中的值与Table_A
的id
列中的数值不匹配,或者外键列中存在NULL值,那么您的朋友指出内部联接将阻止返回Table_B
中的行是正确的。
在这种情况下,我们将使用外部联接,因此即使在未找到来自Table_A
的匹配行的情况下,也可以返回来自Table_B
的行。
您的朋友可能还关心JOIN操作的性能,这可能是因为您的朋友因为没有定义合适的索引而被烧尽了。
假设在Table_A
上存在合适的索引(具有前导列id
)。并且CCD_ 15在CCD_。。。那么,在单列外键和单列主键之间使用简单等联接的单个查询的性能可能会比运行一大堆单独的语句更高效。
或者,也许您的朋友关心的是一个不成熟的ORM框架的问题,该框架不能有效地处理联接查询返回的结果。
如果数据库的实现方式是两个表可以在不同的数据库服务器上,那么使用JOIN将与该设计背道而驰。如果这是设计意图,即表的分离,那么应用程序也应该为这两个表中的每一个使用单独的连接。
除非你的朋友能提供一些避免JOIN操作的具体原因,否则我建议你忽略他的建议。
(必须有充分的理由避免JOIN操作。我怀疑你的朋友可能不了解关系数据库是如何工作的。)
在您的情况下,这并没有什么大的区别,因为您只需要一个id
作为外键,它无论如何都有一个索引。由于它是索引的,所以它将是高效的,并且有一个连接是最好的事情。
根据你想要什么,领域是什么,你想完成什么等等,它变得更加复杂。
所以,是的,你的情况没有太大区别。