使用php计算帖子或存储在数据库中

时间:2009-12-28 15:00:17

标签: php mysql

我有这些表格:

论坛

  • ID
  • 名称
  • 描述

帖子

  • ID
  • forumID

我想知道的是,我应该在论坛中创建一个字段来存储在该论坛中发布的帖子数量?每当有人发帖时更新它。或者我应该用PHP计算它们?这是一个巨大的性能差异吗?

7 个答案:

答案 0 :(得分:3)

您应该只查询您的帖子表并使用您想要的forumID计算帖子。

SELECT count(*) FROM `posts` WHERE `forumID` = XX;

无论如何,您应该在forumID上有一个索引,因为您将在查询中经常使用它。使用该索引,此查询将非常快速地运行。

答案 1 :(得分:3)

小型论坛 - 没什么大不了的。但随着您的论坛的发展,它将在计算简单查询中的帖子数量方面产生巨大的差异。如果您将帖子存储在innodb表而不是myisam中,差异将更加明显。因此,如果您不担心它会变得太大,请使用查询。否则,添加一列。

修改 - 我的建议?节省您自己未来的头痛并添加一栏。

答案 2 :(得分:1)

我想使用MySQL的count()会更好,我认为性能没有太大差异。

答案 3 :(得分:1)

以下查询应该很快:

SELECT COUNT(*)
FROM posts
WHERE forumID = @forumID

您应该确保forumID列上有索引,这样就不需要进行表扫描。

答案 4 :(得分:1)

一站式拍摄:


SELECT post.forumID, forum.name, COUNT(post.forumId) as postCount
FROM post INNER JOIN forum ON post.forumId = forum.id 
GROUP BY post.forumID, forum.name

答案 5 :(得分:1)

问题“我应该在论坛表中添加[计数器]”和“是否有巨大的性能差异”答案是“是”和“是的,如果你有很多消息”。即使您没有大量的消息,我仍然建议您在论坛表中添加这样的计数器。

此外,您应该考虑使用论坛软件而不是编写自己的代码,因为您会遇到很多这种困境,并且您将花费大量时间重写已经存在的内容。

答案 6 :(得分:0)

我创建了一个cron脚本,每小时或每当删除旧帖子时计算COUNT(*)

SET @mytime = CURRENT_TIME()

UPDATE  forums f
SET     post_count = 
        (
        SELECT  COUNT(*)
        FROM    posts p
        WHERE   p.forumID = f.id
                AND p.date <= @mytime
        ),
        count_updated = @mytime

COUNT(*)查询中的新帖子:

SELECT  post_count +
        (
        SELECT  COUNT(*)
        FROM    posts p
        WHERE   forumID = f.id
                AND p.date > f.count_updated
        )
FROM    forums f
WHERE   f.id = @id

这是UPDATE开销和SELECT开销之间的良好权衡。