返回一个大查询还是几个较小的查询更好?
Posted
技术标签:
【中文标题】返回一个大查询还是几个较小的查询更好?【英文标题】:Is it better to return one big query or a few smaller ones? 【发布时间】:2011-04-24 01:03:45 【问题描述】:我正在使用 mysql 来存储视频游戏数据。我有标题、平台、标签、徽章、评论、开发者、出版商等的表格......
当有人查看游戏时,最好使用一个查询来返回与游戏相关的所有数据,还是使用多个查询更好?直观地说,由于我们有评论,将它们包含在同一个查询中似乎没有意义,因为它们需要分页。但在其他情况下,我不确定是分解查询还是使用两个查询...
我有点担心性能,因为我现在加入了以下表格:开发者、发行商、元标记、徽章、标题、流派、子流派、分类……以获取游戏徽章,(来自 games_badges;多对多到游戏表,多对多到徽章表)我可以进行另一个联接,或者运行单独的查询....我不确定什么是最好的....
【问题讨论】:
【参考方案1】:这通常是一个处理问题。
如果进行一次查询意味着检索数千个条目,请调用多个查询让 MySQL 进行处理(求和等)。 如果进行多个查询涉及进行数十或数百个查询,则调用单个查询。显然,您总是同时面临这两个问题,因为如果您提出问题,这两个选项都不是 goto 选项,所以选择确实是:
-
选择一个你可以接受的打击
尽可能多地缓存或缓解它,以便您很少受到攻击
尝试在数据库中插入预处理后的数据,以帮助您处理当前数据
将处理作为 cron 的一部分进行,并让应用程序只检索数据
退后一步,探索其他不需要处理的可能方法
【讨论】:
【参考方案2】:没有灵丹妙药。
-
始终尝试仅获取必要的数据。
没有一个大查询或几个小查询更好的答案。每个案例都是独一无二的,要回答这个问题,您应该分析您的应用程序并检查查询的
EXPLAIN
s
【讨论】:
【参考方案3】:使用一个查询比使用多个查询要快得多,因为查询的启动和查询计划的计算本身的成本很高,并且连续运行多个查询每次都会使服务器变慢。显然,您应该只获取您实际需要的数据,但查询越少越好。
因此,如果您要在一个页面上显示 20 个游戏,您可以使用 LIMIT 子句加快查询(仍然只使用一个查询),并且稍后在他们进入下一页时再次运行该查询。或者您可以让他们等待查询完成并立即获得所有数据。一个大等待或几个小等待。
tl;dr 使用尽可能少的查询。
【讨论】:
在得出“明显更快”之前应该进行性能分析。 是的,你说“明显更快”是一个结论是对的。这假设两个查询集都提供了最佳数据量。与许多只为您获取准确数据的小型查询相比,如果一个查询获取您不需要的数据,它可能会慢得多。 查询性能不仅取决于它返回的数据量。更甚:查询性能取决于查询执行计划,而查询执行计划又取决于查询条件。 说得对,但是您的查询计划应该具有相同的键类型,并且您每次都应该只获取正确的数据。除非您需要非常特定的条件(通常即使如此),否则您可以在一个查询中使用比在多个查询中更简单的连接来完成操作,但在这种情况下,多个查询仍然会花费更多。以上是关于返回一个大查询还是几个较小的查询更好?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 N 个较小的矩形上拆分一个大矩形以使其看起来随机? [关闭]
iOS:将大型 XIB 重构为几个较小的 XIB 文件以提高速度
Matlab - 能够将一个结构的字段分解成几个较小的字段。