MySQL 性能:使用左连接的一个查询与多个查询

Posted

技术标签:

【中文标题】MySQL 性能:使用左连接的一个查询与多个查询【英文标题】:MySQL Performance: one query using left join vs. multiple queries 【发布时间】:2015-02-12 16:26:14 【问题描述】:

我想实现你在 Facebook 上看到的东西:

- Posting status
- Comment status
- Like status (like for comments not implemented yet)

我的表格结构是这样的:

Posts        Users       Comments    Likes
-------      -------     --------    -------
ID           ID          ID          ID
UserID       Username    PostID      PostID
Content                  UserID      UserID
Date                     Content
                         Date

所以此时当有人访问主页时,系统将显示最后 10 个帖子。我的查询在这些表上使用LEFT JOIN

例如,如果有 10 个帖子没有任何 cmets 并且任何点赞,则查询将返回 10 条记录。

但是对于每条评论或点赞,我的查询将返回一条新记录(行),在相应的列中有一些 NULL 值。

最后,我只想检索 10 个帖子,我的查询将返回至少 50 行(如果每个帖子都有一些 cmets 和 likes)。

我想知道这是否会在未来引起问题。我想知道我是否应该更好地使用多个查询并将所有结果解析为一个数组,例如:

1. Select the 10 last posts
2. Save the IDs into array and all data into global array
3. Parse the array and make a prepared query for the comments something like: 
   SELECT * FROM COMMENTS WHERE PostID IN (1, 2, 3, 4, 5, 6,...) 
4. Save the result into global array
5. Repeat again for the like table

我希望我的解释足够清楚:) 谢谢

【问题讨论】:

如果我理解正确的话,真的别无选择。您需要获取您感兴趣的帖子,然后分别获取它们的详细信息(cmets、like 等)。如果您尝试将它们全部放在一个查询中,结果将是不正确的。 Posts left join Comments left join Likes 当 1 个帖子有 2 个 cmets 和 3 个喜欢时,将返回 6 行。 没错。然后我将结果解析为数组,所以最后我得到的结果与使用 3 个不同的查询相同。我更关心的是性能问题。 1 个大查询或 3 个小查询 我不明白当其中一个产生不正确结果时如何比较两个变体。首先,您需要获得正确的结果,然后再关心性能。无论如何,当涉及到性能时,您必须在真实数据和硬件上对其进行衡量。此外,网络通常相对较慢,因此在服务器上尽可能多地执行操作并仅传输最终数据非常重要。从这个角度来看,让一个查询多次(错误地)返回相同的数据并且在客户端上处理它的额外步骤对我来说是非常错误的。 【参考方案1】:

执行一次 50 行查询可减少与服务器通信时的开销,另一方面,它会在检索行后增加处理。

这真的取决于整体解决方案。 但是,除非应用程序对性能至关重要,服务器是瓶颈,否则我会使用 10 个结果集 - 每行一个,可能使用一些类/小部件/对象在页面上显示帖子。

【讨论】:

只是想知道执行 1 个查询返回 30 行是否比执行 3 个查询返回 10 行更好【参考方案2】:

我不是专家,如果我理解正确,您的选择是:

A) 将返回大量 NULL 和重复值的单个大型查询。

[注意:我所说的“全部”是指您感兴趣的所有内容] B) 三个查询:一个用于所有帖子,一个用于所有 cmets,一个用于所有喜欢(都与 users 表连接),然后您可以使用任何语言将它们处理成对象或结构或字典来查询数据库。

我会选择第二个,因为它更容易,而且数量级的增加似乎是良性的,而且在设计方面可能更加灵活。

我不想做的是每个帖子一个查询。这可能迟早会成为一个问题。至少比 A 或 B 早得多。

【讨论】:

你好。是的,你理解得很好。对于A,就是这样。而且我还没有实现Like a comment 的选项。如果我继续使用A,这将在每次有人点赞评论时继续在查询结果中添加行。

以上是关于MySQL 性能:使用左连接的一个查询与多个查询的主要内容,如果未能解决你的问题,请参考以下文章

MySql:查询优化(多个左连接)

使用子查询改进 MySql 查询左外连接

mysql 查询 - 使用左连接和 where 子句的多个计数

MySQL 多个左连接

MySQL连接查询之内连接左连接右连接自连接

如何优化 MySQL 中的多个左连接?