每个页面加载20个SQL查询真的被认为是很重要的吗?

每个页面加载20个SQL查询真的被认为是很重要的吗?,sql,optimization,Sql,Optimization,我在上阅读JeffAtwood的博客,看到很多人认为每页加载20个SQL查询太多了。对于一个具有自动建议、数据自动刷新、自定义页面和厨房水槽的高度动态页面,当前每页的平均查询量是多少 举个简单的例子,Amazon.com实际上用他们认为我会买的东西来定制我的主页。对我来说,这看起来不像它只是在头版使用5个或更少的查询 我还是一个数据库新手,所以如果我遗漏了一些明显的东西,请告诉我 您通常可以在两到三个大查询中获取所有数据,而不是在二十个小查询中。最小化查询量与编写最佳查询以最大化性能同样重要(如

我在上阅读JeffAtwood的博客,看到很多人认为每页加载20个SQL查询太多了。对于一个具有自动建议、数据自动刷新、自定义页面和厨房水槽的高度动态页面,当前每页的平均查询量是多少

举个简单的例子,Amazon.com实际上用他们认为我会买的东西来定制我的主页。对我来说,这看起来不像它只是在头版使用5个或更少的查询


我还是一个数据库新手,所以如果我遗漏了一些明显的东西,请告诉我

您通常可以在两到三个大查询中获取所有数据,而不是在二十个小查询中。最小化查询量与编写最佳查询以最大化性能同样重要(如果不是最重要的话)

当然,您应该始终分析查询计划,并以优化查询为目标,无论是小查询还是大查询

问题是,设计糟糕的网页会执行许多查询,每个小任务一个查询,这些查询很容易分组到一个查询中

例如,设计糟糕的stackoverflow可以进行查询以获得它将在主页上显示的所有问题ID,然后对每个问题进行一次查询以获得摘要和投票。然后你就有了20个无用的查询。一个精心设计的查询将执行一个查询,获取所有显示问题的所有信息


当然,通过良好的缓存,这一切的影响都会减少,这是所有大型网站都会做的,这样你实际上可以进行大量的查询,并且仍然可以获得良好的性能。

我的经验法则是,如果可能的话,根据网站的类型,将头版保持在5-7页以下

内部页面,取决于他们需要什么,可能会有更多,但我尽我所能保持在20以下


但是,同时,取决于您正在尝试做什么以及您正在对这些信息进行何种类型的缓存,如果其中15条信息被大量缓存,那么20条信息可能并不坏……

答案实际上取决于几个关键因素: -网站的流量 -为您提供支持的IT预算 -站点的复杂性和优化所需的资源

如果你有一个网站,每天都会有几次点击,那么谁会在乎20次查询呢。 另一方面,如果你是亚马逊,那么你将以巨大的基础设施成本提供所需的内容

世界上几乎所有其他人都处于这两个极端之间,必须根据自己的资源进行平衡


我要说的另一件事是缓存是你的朋友。

更多的是缓存

如果您获得大量并发页面视图,并且每个页面视图都会执行大量查询,那么每次点击数据库都没有多大意义。单身。时间。尤其是当大量数据返回时,会被仅偶尔更改的半动态参考数据(而不是总是更改的会话或实时数据)所替代

您还可以使用memcached或类似的方法缓存这些数据库结果。您不一定需要缓存整个页面(尽管这是大多数Wordpress缓存插件所做的),因为这会破坏交互性,但您可以逐个数据进行缓存


还有优化查询的问题。特别是避免了可怕的N+1情况,即对父记录执行一次查询,然后对其每个子记录执行一次额外查询。仅往返数据库的延迟就将扼杀页面呈现性能,更不用说对数据库本身造成影响。

如果必须进行20次查询,那就这样吧,但如果是头版,我会有点紧张

在可能的情况下组合查询可能会有所帮助,但考虑缓存是最重要的部分

我目前正在升级一个站点,一年更改5或6次的数据每天被查询数千次,使用一些非常讨厌的SQL将其变成一棵树,但可以作为一棵树结构保存在大约200k的RAM中。(头版也有700k的viewstate,但那是另一个故事……)这些都是毫无理由地削弱网站的东西

因此,关于你应该或不应该做多少查询,没有神奇的数字,但是想想每一个查询,即使你将其中的一些缓存仅5分钟,如果你访问digg的首页,这将产生巨大的差异


当您的站点处于压力之下时,仅对一个查询进行5分钟的缓存就可以删除数千个DB点击。

考虑到除了使用Ajax之外,每个页面都是原子的,我发现在3个或更少的查询中生成相当复杂的页面并不困难。从概念上讲,典型的页面集包括:

  • 上下文信息(与会话和其他全局状态相关)
  • 标题(和相关的1:0-1连接)
  • 详图(1:2米处)
    这需要提前做一些计划;但另一方面,在大多数情况下,这是一个简单的重构练习。

    查询的数量并不总是那么重要。这实际上是你处理关系的方式。如果您有连接池,那么它实际上并不重要,服务器的物理位置也很重要。如果您的服务器在数据中心相邻,那么建立连接可能非常快。如果您的网站是数据库驱动的网站,则大部分时间都花在加载上,等待连接打开和获取数据。图打开一个连接需要100-300毫秒。因此,如果您必须为每次数据库访问打开20个连接,那么只需打开和关闭连接就需要4-6秒

    由于Jeff Atwood正在使用LINQ,我假设他只打开一个连接,执行他的20个查询,然后关闭连接。这一切可能发生得很快

    此外,Jeff的数据库运行在相同的ph值上