php脚本中的最佳MYSQL查询数是多少?

php脚本中的最佳MYSQL查询数是多少?,php,mysql,database,Php,Mysql,Database,我不是专业程序员,所以我不能确定这一点。你的脚本在一个页面上发送多少mysql查询,你的最佳查询数是多少。例如,在stackoverflow的主页上,它列出了问题,并显示了这些问题的作者。is stackoverflow针对每个问题发送mysql查询以获取作者信息。或者它发送一个查询并获取所有用户数据,并将其与问题匹配?确实没有最佳查询数。显然,查询越少越好 如果您使用某种ORM,如Hibernate、Propel、Doctrine等,那么它们生成的查询将与手动编写SQL不同。因此,如果Stac

我不是专业程序员,所以我不能确定这一点。你的脚本在一个页面上发送多少mysql查询,你的最佳查询数是多少。例如,在stackoverflow的主页上,它列出了问题,并显示了这些问题的作者。is stackoverflow针对每个问题发送mysql查询以获取作者信息。或者它发送一个查询并获取所有用户数据,并将其与问题匹配?

确实没有最佳查询数。显然,查询越少越好

如果您使用某种ORM,如Hibernate、Propel、Doctrine等,那么它们生成的查询将与手动编写SQL不同。因此,如果StackOverflow使用ORM,他们可能会有多个查询访问问题和创建问题的用户。或者,他们可能只是将联接与直接SQL一起使用

这实际上取决于您使用的技术以及它在幕后生成SQL的实际操作

为了更好地理解这一点,您应该进行研究:


    • 我喜欢把我的控制在8以下

      但说真的,这是毫无意义的。如果假设一个页面中有800个查询是有原因的,那么你可以继续这样做。您可能会发现,每页的查询数量只取决于您正在做什么,尽管在正常情况下,我会惊讶地看到超过50个(尽管现在,如果您将数据库调用抽象化,很难知道您正在做多少)

      慢查询更重要

      我曾经对某个基于PHP的论坛软件感到失望,该软件在一个页面中有35个查询,运行速度非常慢,但那是很久以前的事了,我现在知道,特定安装运行速度慢的原因与在一个页面中有35个查询无关。例如,其中只有一两个查询占用了大部分时间。它只是有几个非常慢的查询,这些查询由位置良好的索引修复

      我认为识别和修复慢速查询应该在识别和消除不必要的查询之前进行,因为这可能会产生更大的影响。
      考虑一下,即使三个快速查询可能比一个慢查询快得多,查询的数量并不一定与速度有关。 我有一个页面(它实际上是一种测试用例/诊断工具,设计为只由管理员运行),有800多个查询,但只需几秒钟即可运行。我想它们都是非常简单的查询

      尝试缓存

      有多种方法可以缓存应用程序的某些部分,这些方法可以在不降低功能的情况下真正减少查询的数量。像这样的库现在让这个简单化,但运行得很快。这也比减少查询数量更有助于提高性能

      如果查询确实是不必要的,而性能确实起到了作用,则删除/合并它们


      只考虑寻找慢查询并优化它们,或者缓存它们的结果,首先。p> 如果你优先考虑速度,0将是最佳选择。

      我最近开始重构我的一些旧代码,我意识到我在循环中使用了很多查询,因为那时我不知道如何编写包含子查询和联接的SQL查询,所以我把这些嵌套查询集成到一个查询中,这样我就可以一次检索所有的数据,然后以嵌套的方式循环它

      在某些情况下,这会显著加快页面加载速度


      Ergo:了解SQL的可能性是值得的,因此您可以开始使用SQL做更多的事情,而不用使用PHP来做更多事情。

      我不会说任何给定脚本上都有最佳查询数,而是在优化时有一个目标;通常情况下,时间是最主要的考虑因素之一。 如果时间是唯一的问题,您可以优化您的查询,这样您的查询可以比其他查询在更短的时间内执行。 这就是我如何看待优化,我有一个目标,我如何最好地实现它。您是否可以缓存任何信息?根据您的索引,查询中特定顺序的过滤器是否会执行得更好

      我的观点是,优化最好在Db端和应用程序端进行。
      您可能想阅读更多关于数据库优化的内容。

      尽可能少,不要更多。这里没有经验法则。一些网站需要大量的数据库访问,而其他网站则不需要

      所以实际上只有几个db调用,如果它像我想的那样编写的话。在这样一个页面上,一个问题的答案是:

      1) 会话验证,如果您已登录。 2) 当前用户信息,以获取屏幕顶部的用户栏并计算奖牌数量。 3) 获取问题信息以及提问者/最后一位编辑的信息。 4) 检索此问题中使用的标记计数。 5) 一次性选择所有响应和响应者数据

      就这样。有趣的部分是这个问题的关键是多少:

      // this returns one row per revision
      select q.*, u.name, u.u_id, u.points, u.gmedal, u.smedals, u.bmedals
      from questions q left outer join users on q.u_id = u.u_id
      where q_id = :q_id;
      
      // this used to display the tags below the question and the tag counts on the right
      select t.name, count(*)
      from tags t left join tags q on q.tagid = t.tagid
      where t.q_id = :q_id
      
      // this can also get multiple revisions
      select a.*, u.name, u.u_id, u.points, u.gmedal, u.smedals, u.bmedals
      from answers a left outer join users on a.u_id = u.u_id
      where a.q_id = :q_id
      

      这假设各种计数(投票、赞成的问题)缓存在表中并单独存储。

      不要关注查询的数量。这不是一个有用的指标。相反,您需要考虑其他一些事项:

      • 重复了多少个查询
      • 有多少查询具有相交的数据集?或者是另一个的子集
      • 跑步需要多长时间?您是否分析了常用的索引以检查索引
      • 有多少是不必要的复杂

        我多次看到,三个简单的查询一起执行的时间只有返回相同信息的复杂查询的十分之一。同样,SQL是强大的,但是不要疯狂地尝试在SQL中做一些在PHP循环中更容易、更简单的事情<