MySQL 按频繁更新的列和分页对表进行排序

标签 mysql pagination innodb

我陷入了一个问题,我必须通过更新非常频繁的列(喜欢、点等)对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/

相关文章:

javascript - 如何为我的分页添加格式

mysql - 多个表使用多个联结表引用一个表

MySQL 5.6 - InnoDB - DATA_FREE 未使用,但表不断增长

InnoDB 上的 MySQL UPDATE 操作偶尔会超时

php - 使用 cakephp save 在 mysql 数据库中保存十进制值时出现问题

mysql - 选择表中不同列的计数

mysql - 将文件从本地计算机传输到远程服务器

mysql - MySQL 触发器中的常量

python - 这是你分页的方式,还是有更好的算法?

jquery - Bootstrap 数据表分页样式更改