我遇到了一个问题,我必须通过一个非常频繁更新的列(喜欢,点等)对mysql表进行排序并对其进行分页,我不能使用基于简单限制的方法,因为它是很可能当用户到达第二页时由于更改了喜欢的值而改变了排序顺序,我已经在互联网上阅读使用基于游标的方法,但所有示例都证明正在使用某些固定列,如ID或日期时间。而这并不能达到目的。
我目前正在从用户那里获取显示的ID并在NOT IN条件下使用它们不选择之前显示的记录,但该解决方案在速度和优化方面感觉不对。
非常感谢任何帮助。
由于
答案 0 :(得分:0)
首先,移动经常更新的列"进入另一个平行的桌子。这将通过避免与更新"喜欢"的冲突来提高系统效率。而不是接触其余的列。
这样的表只有2列 - id
(主表为JOINing
)和likes
。现在你已经准备好了#34;记住你离开的地方"分页的方法。 (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
的索引。)