在PHP中,每个页面进行多少次数据库调用是可以接受的?

14

我在一个LAMP架构下使用共享主机。显然,每个页面对数据库的调用越少越好。但是多少次调用才算太多呢?两次?十次?一百次?想知道大家的想法。


我倾向于将其关闭为“主观和争议性”。这个问题的意义是什么? - Tomalak
12
这是一个完全有效的问题。 - Philip Morton
4
一个干净的 WordPress 安装在公共页面加载时需要约20个查询。对于我来说太多了,但对其他人来说还好。 - Teson
10个回答

7

这实际上取决于您的(数据库)服务器设置。尽可能缓存大部分信息并将数据库调用最小化,因为数据库几乎在每种情况下都会成为您服务的瓶颈 - 站点使用率越高,这种情况就越明显。因此,无论您做什么,请尽量避免不必要的查询。

我尝试在每个页面上不使用超过10次数据库调用,但这实际上取决于您的基础设施和要提供的信息。


4

我认为这取决于服务器的负载。如果您每分钟只有1个访问者,则每页1-10个数据库调用就足够了。如果您的服务器负载高于此,例如每秒钟10个页面请求,则应考虑缓存以最小化对数据库服务器的负载。


2
当我在互联网繁荣时期参与www.boxman.com项目时,他们有一个网站,在不同的域名下出现了9种不同的语言/国家网站。每个文本块都从数据库中提取,以及通常的产品等...每个页面通常涉及200多个DB请求,但主要返回单个id,string组合。我们有100个用户同时使用系统。
DB在16路RS6000 unix box上运行DB2 SQL。这可能相当于现代3ghz QUAD核英特尔盒子。
系统工作正常...随着数据量的增加,我实施了一个缓存,涉及编写同步进程,将每天静态的数据移动到Web服务器驱动器上,因此不再影响DB。
基本上,我会说如果性能还可以就没问题!但是你应该允许扩大需求并准备好应对它。

1

我认为只要服务器(Web和数据库)能够处理所有请求并在合理的时间内返回页面,您当前的查询数量就可以了。这在很大程度上取决于服务器。 不过,无论如何尽可能少地使用查询是一个好的规则。


1
数字实际上没有给出。它取决于服务器的使用方式,而不是服务器的性能。 - StingyJack
我认为他的意思是,无论数字是多少,只要数据库能够在合理的时间内处理它就可以了。 - Alex Fort

1

一条绳子有多长?一个人的腿应该有多长?在页面加载时应该进行多少个数据库查询?

没有单一的答案。显然,进行不必要的查询是一个坏主意。过度启动数据库连接更糟糕。缓存不变的值是好的。除此之外,你不能随意地说“你应该只在一个页面上使用$N个查询”——这取决于你想做什么和你的性能目标是什么。

理论上,任何应用程序都可以编写成只使用一个数据库查询——即使该查询是一个涉及未索引的完整表扫描和返回大量大部分为空的行的20路连接,一旦它到达您的应用程序,就需要处理荒谬的内存和时间。显然,这将是非常糟糕的事情。一般来说,避免做明显浪费的事情(比如在循环中执行一堆单行查询),并且后来再考虑性能问题。

以Donald Knuth的话说,“我们应该忘记小细节,大约97%的时间:过早优化是万恶之源。” 每个人都在谈论“可扩展性”,好像他们真的会成为下一个Twitter一样,但实际上,如果Twitter聚焦于如今这么大的规模,他们可能根本不可能在第一时间推出产品。

1

最终结果取决于用户期望的体验。如果他们期望页面上显示全面的数据,那么必须有一些期望:1)网站能够在负载下运行,给定从数据库中提取的任何数量的数据,2)加载页面的时间成本将取决于该特定页面的数据负载,而不是整个服务器负载。

可接受的数据库调用次数的一个重要因素也是底层数据库设计。由于底层数据库结构的复杂性,存在着企业级电子商务网站每个(未缓存的)页面加载时经常进行数百次调用的情况。

总的来说,看待数据库调用的好方法是确定特定页面是否在可接受的时间内加载,然后查看优化加载时间、CPU和内存使用的策略。


0

除了缓存之外,另一个重要的问题是使用预处理语句。当您执行查询时,数据库必须 1) 分析查询并 2) 执行它。如果您使用预处理语句,则数据库可以缓存上次使用的查询计划,因此每个查询都将对数据库管理系统产生较小的负担。不要根据您执行的查询数量来计算负载,而是要考虑您对数据库管理系统施加的压力。执行100个预处理查询可能比在代码中生成50个即席查询更快。


我不认为这在这种情况下会有丝毫的差别 - 分析查询可能不是问题所在。我更怀疑的是与数据库的往返,查询本身可能相当容易。 - MarkR

0

记住,每天10万个页面请求只相当于每秒不到1个请求。只要它们不同时请求。


-1

别忘了

  1. 使用存储过程 - 它们运行更快。
  2. 每周运行一次新的存储过程。(数据库使用其当前状态优化存储过程。如果这种情况发生变化,那么存储过程将不再是最佳选择)。
  3. 使用像“show plan”这样的命令来真正理解您的SP正在做什么。
  4. 存储过程可以返回多个数据集(数据表),这可以减少网络流量。单个存储过程可以执行多个操作。

Tony


-4

一个或者更少总是最好的。两个通常就太多了。

如果你可以在单个查询中返回多个结果集,那么就这样做。如果信息相对静态,那么请将其缓存并从缓存中获取。

进行10次独立的数据库调用并不好,但对于低使用率的网站来说也不会致命。


2
将多个查询组合在一起不仅会使源代码变得复杂,而且通常比进行多个简单调用效率低。SQL_CALC_FOUND_ROWS是一个完美的例子 - 在除了微不足道的数据集之外,分别计数和检索两个查询更快。聪明并不总是更好。 - JoeBloggs
尽可能减少与数据库的往返次数始终是最佳选择。这总是回答这个问题的方法。 - StingyJack

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接