我陷入了一个问题,我必须通过更新非常频繁的列(喜欢、点等)对mysql表进行排序并对它进行分页,我不能使用基于简单限制的方法,因为它很有可能当用户到达第二页时,由于喜欢的值发生变化,排序顺序已发生变化,我在互联网上阅读过使用基于光标的方法,但所有示例都演示了使用某些固定列,例如 ID 或日期时间。但这并不能达到目的。
我目前正在从用户那里获取显示的 ID,并在 NOT IN 条件下使用它们来不选择之前显示的记录,但该解决方案在速度和优化方面感觉不正确。
任何帮助将不胜感激。
谢谢
最佳答案
首先,将“经常更新的列”移动到另一个并行表中。通过避免更新“喜欢”与触摸其余列的冲突,这将使系统更加高效。
这样的表只有 2 列 - id
(用于与主表JOINing
)和likes
。现在您已准备好采用“记住您上次停下来的位置”的分页方法。 (OFFSET
对此非常不利。)
但请记住两件事以记住您上次停下的位置:$leftoff_id、$leftoff_likes。假设您想要“降序”:
PRIMARY KEY(likes, id) -- for this query
INDEX(id, likes) -- for maintenance and JOINs
SELECT likes
From Likes
WHERE likes <= $leftoff_likes
AND ( id < $leftoff_id OR likes < $leftoff_likes )
ORDER BY likes DESC, id DESC
LIMIT 10;
(我使用 id DESC
因为 MySQL 无法使用 ORDER BY x DESC, y ASC
的索引。)
关于MySQL 按频繁更新的列和分页对表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38850380/