- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在分析显示最近 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 小时的记录,但不能像这样按小时分组: SELECT HOUR(CompDate) AS hour, COUNT(1) AS action FROM mytable WHERE (
我们有一个自动完成列表,当您向某人发送电子邮件时会填充该列表,这一切都很好,直到列表变得非常大,您需要输入越来越多的地址才能找到您想要的地址, 这违背了自动完成的目的 我在想应该添加一些逻辑,以便自动
我在 android 的锁屏上工作我们如何禁用导航软按钮,已经尝试了所有方法,systemoverlay但它不起作用,在按下主页按钮时它会终止服务和 Activity 。 最佳答案 后退按钮可以通过覆
我有一个报告创建时间为 2016-05-30,现在我需要从报告时间开始的最后 7 天。我怎样才能使用时刻? report_create_time = moment('2016-05-30').form
我想找出向量中最接近的三个数字。 就像是 v = c(10,23,25,26,38,50) c = findClosest(v,3) c 23 25 26 我试过 sort(colSums(as.ma
考虑以下表结构: id speed 1 100 2 200 3 300 4 400 5 500 考虑以下查询:"SELECT * FROM records WHERE
我正在开发一个依赖 YouTube 直播和实时聊天(也来自 YouTube)的网络应用。事情进展顺利,突然嵌入的聊天功能无法在移动设备上运行。 我试图在我这边找到一个错误或一些无效的配置,但我找不到。
我正在制作一个 React Native 应用程序,它有一个安全部分,用户必须在其中输入密码才能解锁 protected 内容。问题是,当用户在锁定该部分之前切换到另一个应用程序时,将生成屏幕截图以及
我有一条 SQL 语句 (SQL Server Management Studio),我通过仪表板软件将数据传递到 where 语句中。用户可以选择年份(2013 年或现在的 2014 年)和月份(作
我有一个脚本可以添加一组行,使您能够在 SharePoint 列表表单中捕获其他访问者的信息。我有两个 anchor 标记,一个用于添加,另一个用于删除。当我添加一个新的访问者时它有效,当我删除访问者
我正在学习斯坦福 iOS 类(class),我有一个问题,我认为与最近的更新有关。这是代码部分: func evaluate(ops: [Op]) -> (result: Double?,remain
我注意到我的应用有一个奇怪的行为。每当我按下主页按钮时,我的应用程序就会被杀死。我没有在应用程序堆栈中看到该应用程序。我可以看到之前启动的其他应用程序。最初我怀疑 android:launchMode
我需要获取过去 7 天内的所有付费和临时条目,但我总是收到所有退回的内容。我不确定我做错了什么,我已经阅读了这里的很多帖子,但无法理解它是什么。 MySQL 5.6(如果它与我一直在做的事情有什么不同
我的表有一列以 mysql time() 格式格式化。 当它是一个值分配给名为 $preRemainOt 的 php 变量时我想重新安排到最近的 15 分钟 function roundTime($w
我想获取过去 7 天内每天每个产品的最后时间戳。数据库中有数千条记录。我怎样才能通过查询来做到这一点。大约有 25 种不同的产品,每种产品每天大约有 50 个时间戳。 表:构建数据 'Timesta
我现在的代码正在从 SQL 中获取移动应用程序中的数据,首先添加显示,我需要将其设置为在我的 Android 应用程序中显示最后添加的第一个。我有如下所示的 api 代码,最新的是根据我的要求显示的,
我有一张 table ,说 table 的描述为: | ID | SNO | c1 | c2 | c3 | ___________________________________ |
我有两个大小相等的向量,例如 A=[2.29 2.56 2.77 2.90 2.05] and B=[2.34 2.62 2.67 2.44 2.52]. 我有兴趣在两个相同大小的向量 A 和 B 中
之前,我在这里发布了一个问题,询问有关如何从驱动器读取和写入数据的建议,而不是通过像“aaa.txt”这样的文件标签,而只是扇区..我被建议尝试阅读和写作....但新问题出现了……毛茸茸的参数 int
我想删除在给定时间段内未登录的用户,但我稍后会根据结果选择时间段。 所以我需要报告,其中我将收到过去 1 个月、2 个月...... n 个月内未登录的用户数量。 我不太清楚如何在单个 mysql 查
我是一名优秀的程序员,十分优秀!