【问题标题】:MySQL Sorting a table by frequently updated column and PaginationMySQL按经常更新的列和分页对表进行排序
【发布时间】:2016-08-13 03:30:52
【问题描述】:

我遇到了一个问题,我必须通过一个非常频繁更新的列(喜欢、点等)对 mysql 表进行排序并对其进行分页,我不能使用简单的基于限制的方法,因为它很有可能当用户到达第二页时,由于喜欢值的变化,排序顺序已经改变,我在互联网上阅读过使用基于光标的方法,但所有示例都使用一些固定列,如 ID 或日期时间。这并没有达到目的。

我目前正在从用户那里获取显示的 ID,并在 NOT IN 条件下使用它们来不选择先前显示的记录,但该解决方案在速度和优化方面感觉不正确。

任何帮助将不胜感激。

谢谢

【问题讨论】:

  • 如果您的结果集足够小,那么您可以发送整个表格并使用类似 datatables.net 的方式在客户端处理分页
  • 感谢您的评论,我处理的表大约有 900k 行。
  • 没有不混淆的解决方案。但是,喜欢的次数越多,订单频繁且发生重大变化的可能性就越小。
  • @Jakumi,我不确定我是否完全理解你所说的,你能解释一下吗?谢谢
  • 一个相对简单的想法是对排名进行快照,并让用户携带最后一个快照的时间戳,直到他们决定更新。如果没有用户使用旧快照,您可以安全地删除它。然而,900k 行只是快照;o/

标签: mysql pagination innodb


【解决方案1】:

首先,将“经常更新的列”移到另一个并行表中。这将通过避免更新“喜欢”与触摸其余列之间的冲突来提高系统效率。

这样的表只有 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 使用索引。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-12
    • 1970-01-01
    • 2013-05-26
    • 2014-11-30
    • 2013-05-04
    • 1970-01-01
    • 2015-06-21
    • 2016-10-18
    相关资源
    最近更新 更多