我正在分析显示最近20篇帖子的不同方法以及每篇帖子的最新4条评论。这有点像facebook墙,但不会有喜欢,分享和任何其他
p_id
=该帖子的编号user_id
=他们发布的用户poster_user_id
=发帖的人post
comment_id
=该评论的编号post_id
=评论与commenter_user_id
=发表评论的人comment
我想到了这些方法
1)查询POST表并获取最近的20篇帖子,将帖子ID发送到数据库并从COMMENT表中获取评论。但是对于这个总呼叫将是
1(帖子)+20(评论)= 21个数据库电话
2)加入POST和COMMENT表并获取最近20篇帖子的所有评论,并在显示前一个POST_ID的检查时,如果相同则不显示帖子,只显示评论。但这种方法
获取了大量不必要的数据
3)查询POST表并获取最近的20篇帖子,获取帖子ID,动态构建评论查询(在PHP中创建以下类型的查询)
SELECT comment FROM comments WHERE post_id=<1st latest_id> ORDER BY comment_id desc LIMIT 4
UNION ALL
SELECT comment FROM comments WHERE post_id=<2nd latest_id> ORDER BY comment_id desc LIMIT 4
UNION ALL
SELECT comment FROM comments WHERE post_id=<3rd latest_id> ORDER BY comment_id desc LIMIT 4
....................up to 20
这里你只有
1(帖子)+1(评论)=两个数据库电话
这种方法看起来不错
4)使用第三种方法并将结果存储在memcached中一分钟或30秒。如果用户发表任何评论或新帖子,请使用jquery并在浏览器中更新其条目。如果他按下刷新,则向服务器发送一个标志,以再次查询数据库并将它们存储在memcached中。
这种方法一分钟只需要1或2个数据库调用,但用户再次获取一分钟前发布的数据,而不是最近发布的数据..这对常规论坛来说很好
5)即使不是每分钟查询一次数据库,也是第一次从数据库中获取前20个帖子并将其与评论一起保存在memcached中。每当用户撰写新帖子时,从memcached中删除第20个帖子并将新帖子添加为第1个帖子。同样为评论删除第4条评论并将新评论附加到帖子。但这需要开发工作。当然,我们必须将记录保存到数据库(或者可以在需要时遵循一些组提交)。
如果我们编码完美
,这对我来说似乎是最好的方法任何人都有任何其他方法或任何良好的链接来实施第5种方法? (更新memcached)
感谢大家的帮助
答案 0 :(得分:2)
使用user variable技巧:
SELECT post_id, comment_id
FROM (
SELECT post_id, comment_id,
@i := IF(@type <=> post_id, @i+1, 0) AS comment_number,
@p := post_id
FROM comments NATURAL JOIN (SELECT * FROM (
SELECT p_id AS post_id FROM posts ORDER BY p_id DESC LIMIT 20
) z) z, (SELECT @type:=NULL) init
ORDER BY post_id DESC, comment_id DESC
) t
WHERE comment_number < 4
ORDER BY post_id DESC, comment_id DESC
这仍然要求从所有帖子的评论中填充临时表t
,然后仅对前4个过滤(在最外面的查询中)。可以通过适当排序的复合索引来避免这种情况(post_id, comment_id)
:
SELECT post_id, comment_id,
@i := IF(@type <=> post_id, @i+1, 0) AS comment_number,
@p := post_id
FROM comments FORCE INDEX (index_name) NATURAL JOIN (SELECT * FROM (
SELECT DISTINCT post_id
FROM comments
ORDER BY post_id DESC
LIMIT 20
) z) z, (SELECT @type:=NULL) init
GROUP BY post_id DESC, comment_id DESC
HAVING comment_number < 4