我有这些表格:
我想知道的是,我应该在论坛中创建一个字段来存储在该论坛中发布的帖子数量?每当有人发帖时更新它。或者我应该用PHP计算它们?这是一个巨大的性能差异吗?
答案 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
开销之间的良好权衡。