gpt4 book ai didi

php - MYSQL、PHP、MEMCACHED - 显示最近的 20 条帖子以及最近的 4 条评论

转载 作者:行者123 更新时间:2023-11-29 02:31:02 24 4
gpt4 key购买 nike

我正在分析显示最近 20 篇帖子以及每篇帖子的最新 4 条评论的不同方法。这是一些类似于 facebook 的墙,但不会有喜欢、分享和任何其他内容

示例表结构

帖子
  • p_id = 该帖子的编号
  • user_id = 他们正在发布的用户
  • poster_user_id = 发帖人
  • 发布
评论
  • comment_id = 该评论的编号
  • post_id = 评论相关的帖子编号
  • commenter_user_id = 发表该评论的人
  • 评论

我想到了这些方法

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 篇文章并将新文章添加为第一篇文章。同样对于评论,请删除第 4 条评论并将新评论附加到帖子中。但这需要一项开发工作。当然,我们必须将记录保存到数据库中(或者在需要时可以跟随一些组提交)。

如果我们编码完美,这对我来说似乎是最好的方法

有人有任何其他方法或任何好的链接来实现第五种方法吗? (更新内存缓存)

谢谢大家的帮助

最佳答案

使用 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

关于php - MYSQL、PHP、MEMCACHED - 显示最近的 20 条帖子以及最近的 4 条评论,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13160827/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com