好吧,所以我喜欢用 PHP 和 MySQL 制作论坛软件,尽管有一件事一直困扰着我,而且只有一件事;
论坛主页,您可以在其中查看论坛列表。每个论坛都会显示论坛名称、在该论坛中发表的帖子数量、在该论坛中发表的讨论数量以及该论坛中的最后一张海报。问题在于,当所有这些东西都存储在不同的表中时,获取所有这些数据。得到它不是什么大问题,根本不是真正的问题,但有效地做到这一点是我所追求的。
我目前的做法是这样的;将当前的帖子、讨论和最后一张海报的数量静态存储在论坛表本身中,而不是从不同的表中抓取数据——“帖子”、“讨论”、“论坛”等。然后当用户帖子,它会更新“论坛”表,将帖子数量增加 1 并更新最后一张海报,如果他们正在进行新的讨论,也会将讨论增加 1。出于某种原因,这对我来说似乎效率低下和肮脏,但也许只是我。
这是另一种我担心效率极低的方法;实际上去每个表 - “帖子”,“讨论”,“论坛” - 并获取数据。问题是,一页上可能有数百个论坛......而且我必须使用 COUNT 语句来获取帖子或讨论的数量,这意味着我必须使用子查询 - 更不用说第三个子查询来获取最后一张海报。话虽这么说...查询将类似于以下伪代码:
SELECT foruminfo, (
SELECT COUNT(id)
FROM posts
WHERE forumId = someid
), (
SELECT COUNT(id)
FROM discussions
WHERE forumId = someid
), (
SELECT postinfo
FROM posts
WHERE forumId = someid
ORDER BY postdate
DESC LIMIT 1
)
FROM forums
ORDER BY position DESC;
因此,如果我列出了数百个论坛,那么基本上这些子查询可以运行数百次。每秒有数百名用户查看该页面,这不会造成相当大的压力吗?我不完全确定子查询是否会导致与普通查询相同的负载量,但如果确实如此,那么它似乎肯定会非常低效。
有任何想法吗?:(