使用计数还是有一个领域?

时间:2011-01-09 07:27:48

标签: php sql mysql count

相当简单的概念,制作一个非常基本的留言板系统,我希望用户有一个帖子计数。现在我正在讨论是否在每次创建一个帖子时添加一个记录,或者每次删除一个帖子时减去一个。但是我确信在请求发布计数时执行计数查询会因为不可预知的情况而更准确(比如线程被删除并且它没有正确地降低它们的计数),但是这似乎效率较低每次加载他们的帖子计数时都要运行查询,特别是在他们在同一页面上有10个帖子的情况下,它会列出每个帖子的帖子数。

思想/忠告?

由于

6 个答案:

答案 0 :(得分:3)

post_count绝对应该是用户表中的一列。与在每个线程视图上运行一些计数查询所产生的额外数据库负载相比,实现这一目标的额外努力是微不足道的。

如果使用某种orm或数据库抽象,将计数添加到其创建/删除过滤器应该非常简单。

答案 1 :(得分:2)

每次都去算一下。除非您的负载是天文数字,否则COUNT不应成为问题,并减少保存和更新数据所需的工作量。

只需确保在user_id列上放置索引,以便可以有效地使用WHERE子句过滤数据。

如果你没有为你做到这一点,你可以实现缓存策略,但鉴于它是一个简单的留言板,你不应该在一段时间内遇到这个问题。

编辑:

刚刚看到您对同一个查询在页面上重复10次的第二个问题。不要这样做:)只需拉一次数据并将其存储在变量中。无需多次重复相同的查询。

答案 2 :(得分:2)

只需使用COUNT。它将更准确,并将避免任何可能的遗漏案件。

除非您的网站流量非常高,否则您提及在网页上多次显示帖子计数的情况不会有问题。

在任何其他情况下,数据库服务器的查询缓存将执行查询,然后保留响应的缓存,直到查询依赖的任何表发生更改。在单页加载过程中,没有其他任何内容可以更改,因此您只需执行一次查询。

如果你真的需要担心它,你可以将它自己缓存在一个变量中,然后只执行一次查询。

答案 3 :(得分:2)

一般来说,与应用逻辑相比,您的数据库查询总是非常有效。因此,在用户表中维护post_count所浪费的时间很可能远远低于在发布评论时运行查询以更新用户表所需的时间。

此外,通常认为DB结构不正确,因为您要描述一个字段。

答案 4 :(得分:2)

两者都存在争议,因此最终取决于您期望的流量。如果您的代码是可靠的并且分层正确,您可以放心地在用户记录中保留行数而不必担心丢失准确性,并且随着时间的推移,count()可能会变得很重,但更新行数也会增加开销。

对于一个小网站,它几乎没有区别,所以如果(并且只有)你是效率的坚持者,获得有用答案的唯一方法是运行一些基准测试并自己找出答案。无论如何,这将是diddley蹲下2/8的3/10,所以做任何感觉都是正确的:)

答案 5 :(得分:2)

将帖子计数存储在Users表的列中是完全合理的。然后,为确保您的帖子计数不会随着时间的推移变得越来越不准确,请运行计划任务(例如,每晚)根据您的帖子表更新它们。