JOIN查询是否比多个查询快?(运行主查询,然后根据主查询的结果运行许多其他select)
我这么问是因为加入它们会使我的应用程序的设计复杂化
如果它们快了,有人能大致估计出快了多少吗?如果是1.5倍,我不在乎,但如果是10倍,我就在乎。
JOIN查询是否比多个查询快?(运行主查询,然后根据主查询的结果运行许多其他select)
我这么问是因为加入它们会使我的应用程序的设计复杂化
如果它们快了,有人能大致估计出快了多少吗?如果是1.5倍,我不在乎,但如果是10倍,我就在乎。
当前回答
根据数据库的复杂性与开发人员的复杂性的不同,执行多次SELECT调用可能更简单。
尝试对JOIN和多个select运行一些数据库统计信息。看看在您的环境中,JOIN是否比SELECT更快/更慢。
然后,如果将其更改为JOIN将意味着额外的一天/一周/一个月的开发工作,我将坚持使用多个select
欢呼,
BLT
其他回答
根据数据库的复杂性与开发人员的复杂性的不同,执行多次SELECT调用可能更简单。
尝试对JOIN和多个select运行一些数据库统计信息。看看在您的环境中,JOIN是否比SELECT更快/更慢。
然后,如果将其更改为JOIN将意味着额外的一天/一周/一个月的开发工作,我将坚持使用多个select
欢呼,
BLT
根据我的经验,我发现运行几个查询通常更快,特别是在检索大型数据集时。
当与来自另一个应用程序(如PHP)的数据库交互时,到服务器的一次访问要比多次访问多。
还有其他方法可以限制访问服务器的次数,同时仍然运行多个查询,这些方法通常不仅更快,而且使应用程序更易于阅读—例如mysqli_multi_query。
当涉及到SQL时,我不是新手,我认为对于开发人员,尤其是新手来说,有一种趋势是花费大量时间试图编写非常聪明的连接,因为它们看起来很聪明,而实际上有一些聪明的方法来提取数据,看起来很简单。
最后一段是我的个人观点,但我希望这能有所帮助。我同意其他人的观点,尽管他们认为你应该进行基准测试。两种方法都不是灵丹妙药。
是的,使用join的查询会更快。虽然不知道要查询的表之间的关系、数据集的大小或主键的位置,但几乎不可能说速度有多快。
为什么不把这两种情况都测试一下,然后你就会确定……
是否应该使用连接首先是关于连接是否有意义。只有在这种情况下,性能才会被考虑,因为几乎所有其他情况都会导致明显更差的性能。
性能差异很大程度上取决于所查询信息的相关性。联接是有用的,当数据相关且索引正确时,联接速度很快,但它们通常会导致一些冗余,有时结果比需要的多。如果您的数据集不是直接相关的,那么将它们放在一个查询中将导致所谓的笛卡尔积(基本上是所有可能的行组合),这几乎不是您想要的结果。
这通常是由多对一对多关系引起的。例如,HoldOffHunger的回答提到了一个关于帖子、标签和评论的查询。评论与一篇文章相关,标签也是如此。但是标签与注释无关。
+------------+ +---------+ +---------+
| comment | | post | | tag |
|------------|* 1|---------|1 *|---------|
| post_id |-----| post_id |-----| post_id |
| comment_id | | ... | | tag_id |
| user_id | | | | ... |
| ... | | | | ... |
+------------+ +---------+ +---------+
在这种情况下,最好至少有两个独立的查询。如果您试图连接标记和注释,因为两者之间没有直接的关系,您最终会得到标记和注释的所有可能组合。许多*许多=许多许多。除此之外,由于帖子和标签是不相关的,您可以并行执行这两个查询,从而获得潜在的收益。
让我们考虑一个不同的场景:您希望将评论附加到一篇文章,以及评论者的联系信息。
+----------+ +------------+ +---------+
| user | | comment | | post |
|----------|1 *|------------|* 1|---------|
| user_id |-----| post_id |-----| post_id |
| username | | user_id | | ... |
| ... | | ... | +---------+
+----------+ +------------+
This is where you should consider a join. Aside from being a much more natural query, most database systems (including MySQL) have lots of smart people put lots of hard work into optimizing queries just like it. For separate queries, since each query depends on the results of the previous one, the queries can't be done in parallel, and the total time becomes not just the actual execute time of the queries, but also the time spent fetching results, sifting through them for IDs for the next query, linking rows together, etc.
对于内部连接,单个查询是有意义的,因为您只获得匹配的行。 对于左连接,多个查询要好得多……看看下面我做的基准测试:
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服务器就在我的应用服务器旁边…所以连接时间可以忽略不计。如果您的连接时间以秒为单位,那么可能会有好处
弗兰克