2009-04-30 23 views
3

我不是专业的程序员,所以我不能肯定this.How很多的MySQL查询脚本在一个页面发送的,什么是。比如在计算器的主页它列出的问题显示了这些问题,作者你最佳的查询号码。是stackoverflow发送mysql查询foreach问题来获取作者的信息。或者它发送1个查询并获取所有用户数据并将其与问题进行匹配?php脚本中的最佳MYSQL查询号是什么?

+0

Duplicates http://stackoverflow.com/questions/561900/how-many-mysql-queries-should-i-limit-myself-to-on-a-page-php-mysql/562106 – Zoredache 2009-04-30 16:46:36

回答

3

请不要关注查询的数量。这不是一个有用的指标。相反,你需要看一些其他的东西:

  • 有多少查询是重复的?
  • 有多少查询有相交的数据集?或者是另一个的子集?
  • 他们需要跑多久?你有没有分析常见的检查指标?
  • 有多少不必要的复杂?

    多次我见过三个更简单的查询一起执行一个复杂的十分之一的时间返回相同的信息。同样的道理,SQL功能强大,但不要试图在SQL中做一些更容易和更简单的操作。

  • 你在做多少进步加工?

    如果您无法避免使用大型数据集进行更长时间的查询,请尝试重新排列算法,以便您可以处理来自数据库的数据集。这使您可以在MySQL中使用无缓冲的查询,并改善您的内存使用情况。如果你在做这件事的时候可以提供输出,你可以通过尽早提高第一个输出来提高你的页面的感知速度。

  • 你能缓存多少这些数据?即使将其缓存几秒钟,也可以帮助极大。

2

确实没有最佳数量的查询。显然,你做得越好的问题越少。

如果使用某种像Hibernate,行走,教义,等他们将不同于如果你手工编写的SQL查询生成的ORM。因此,如果StackOverflow使用ORM,它们可能会有多个查询访问问题以及创建问题的用户。或者他们可能只是使用直连SQL进行连接。

这真的取决于你所使用的技术,它实际上在幕后做生成SQL什么。

事情你应该研究,以更好地理解这种:

8

我喜欢让我的8

下虽然严重,这是毫无意义的。如果假设有一个原因让你在一个页面上有800个查询,那么你可以继续做下去。你可能会发现,每页查询的数量将取决于你正在做的事情,尽管在正常情况下,我会惊讶地发现超过50个(尽管现在很难知道有多少如果你将数据库调用抽象出来,你会这么做)。

慢查询此事更

我曾经在某基于PHP论坛软件其中有35个查询在一个页面,运行速度很慢很沮丧,但那是很久以前的事,我现在知道特定安装运行缓慢的原因与在页面中查询35次无关。例如,大多数时间只有一个或两个这样的查询。它只是有一些非常缓慢的查询,通过良好的索引来修复。

我认为,识别和修正慢速查询应识别和消除不必要的查询,因为它可能让很多更差面前。
考虑到即使三个快速查询可能比一个慢速查询快得多 - 查询数量不一定与速度有关。

我有一个页面(这实际上是一种测试用例/诊断设计成由管理员只运行工具),其中有超过800个查询,但它在几秒钟内运行。我猜他们都是非常简单的查询。

尝试缓存

有各种方式,可以真正减少对你的查询数应用程序的缓存部分,而不降低功能。像memcached这样的图书馆使得这些日子变得轻而易举,而且运行速度非常快。与减少查询数量相比,这还可以帮助提高性能。

查询是否真的是不必要的,而且性能还真是发挥作用,然后删除/将它们结合起来

只是考虑找慢查询和优化他们,或者他们的缓存结果,第一。

-2

如果您优先考虑速度,则0将是最优的。

+0

你已经告诉真相,并得到真正的出纳员以前得到的奖励。在俱乐部欢迎! :) – 2009-04-30 16:54:40

2

我最近开始重构我的一些旧代码,并且我意识到我在循环内部使用了很多查询,因为那时我不知道如何用子查询和连接等来编写SQL查询。所以我去了将这些嵌套查询集成到一个查询中,以便我可以一次检索所有数据,然后以嵌套方式遍历它。

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

Ergo:绝对值得了解SQL的可能性,因此您可以开始使用SQL进行更多操作,而使用PHP更少。

1

我不会说在任何给定的脚本中都有最佳的查询数量,而是在优化时有一个目标;除其他事项外,通常时间是主要关心的问题。 如果时间是唯一的问题,您可以优化您的查询,以便可以在比其他查询执行时间少的时间执行查询。 这就是我如何看待优化,我有一个目标,我如何最好地实现它。有没有可以缓存的信息?根据您的索引,您的查询中的某个特定顺序的过滤器性能会更好......

我的观点是,优化最好在Db端和应用程序端都完成。 您可能想了解有关数据库优化的更多信息。

0

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

因为我认为它实际上只有几个数据库调用。在这样的一个页面上,这个问题的答案是:

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 

这假定各种计数(票窗口,有利于问题)的桌子上高速缓存,以及分开存放。

+0

评论怎么样?另外,你认为用户栏中的数据是直接来自数据库还是来自会话? – Mohamad 2011-06-02 17:16:14

0

最佳数量与显示用户所期望的信息一样多。我总是尽量保持在个位数。对于需要几个查询但很少发生更改的信息,我将结果缓存在通用缓存表中,因此只需要一个查询。将其存储为序列化数组以保留一个易于访问的结构。

当我第一次安装WordPress时,我惊讶地发现基本安装超过了20个查询!插件会增加这个数字(一些相当多)。但通过缓存,这可以减少到零(SuperCache)。如果您的内容每10分钟更改一次,为什么每次都会动态生成内容?

非常极端的是像Facebook这样的平台,每个页面都是独一无二的内容,为查看它的用户定制。你必须每次查询。

但无论如何,我很少看到需要打双位数查询计数。

相关问题