缓存 MySQL 中排序所需的聚合?
Posted
技术标签:
【中文标题】缓存 MySQL 中排序所需的聚合?【英文标题】:Caching aggregrates that are needed for sorting in MySQL? 【发布时间】:2021-11-13 07:28:45 【问题描述】:例如,考虑一个具有 2 个 mysql 表的应用程序:posts 和 cmets。我想获取按最新评论时间排序的帖子。如果每个帖子有很多 cmets,这会很慢。我想在某处缓存每个帖子的最新评论时间。
如果我在 Redis 中缓存每个帖子的最新评论时间,那么我不能使用它在 MySQL 中进行排序。以下是我能想到的方法:
在帖子表中添加“最新评论时间”列,然后在创建新评论时更新此列(可能会出现性能问题,因为 MySQL 会锁定该行)
创建仅包含帖子 ID 和最新评论时间的新表,然后在创建新评论时更新此表(需要加入主帖子表)
将元组(最新评论时间,帖子ID)存储在Redis Sorted Sets中,然后从Redis中获取帖子ID(如果我在where
子句中有很多条件,那么很难表示这些条件在 Redis 中)
我主要关心的是更新最新评论时间的频率。即使我对它进行批处理(例如每分钟最多更新一次每个帖子),它仍然可能很慢。
这些方法中哪些是“好”或“坏”?有更好的方法吗?
【问题讨论】:
您需要执行的实际查询是什么?您是否考虑过为您的表编制索引? 查询是否仅限于单个user
? Comments
表中有 user_id
吗?请为相关表格提供SHOW CREATE TABLE
。
【参考方案1】:
一位用户对每个帖子的最新评论:
SELECT p.*
FROM ( SELECT post_id, MAX(dt) AS last_comment_dt
FROM Comments
WHERE user_id = ?
GROUP BY post_id ) AS x
JOIN Posts AS p USING(post_id)
ORDER BY last_comment_dt DESC
索引:
Comments: INDEX(user_id, post_id, dt)
每个帖子的最新评论:
SELECT p.*
FROM ( SELECT post_id, MAX(dt) AS last_comment_dt
FROM Comments
GROUP BY post_id ) AS x
JOIN Posts AS p USING(post_id)
ORDER BY last_comment_dt DESC
索引:
Comments: INDEX(post_id, dt)
【讨论】:
假设我们正在浏览所有帖子,这将遍历每个帖子的每条评论 我真的需要看到CREATE TABLEs
,这样我才能了解用户、帖子和 cmets 之间的关系。在某些架构设计中,“评论”是“帖子”的特例。以上是关于缓存 MySQL 中排序所需的聚合?的主要内容,如果未能解决你的问题,请参考以下文章
Thinkphp3.2下导入所需的类库 同java的Import 本函数有缓存功能