mysql 如何分批 读取数据

情景是数据库里有一系列的post(新闻类),现在想根据post表中有的post_date(时间),view(浏览数量),或者post_like表的likeCount进行排序,并分批读取数据,limit在25

比如说post_date:

SELECT post.*, user.user_avatar, user.user_name,

        (SELECT COUNT(*) FROM comment
        WHERE comment.post_id = post.post_id) AS commentCount,
        (SELECT COUNT(*) FROM post_like
        WHERE post_like.post_id = post.post_id) AS likeCount
  FROM post, user where post.user_id=user.user_id and post.post_date < "2018-04-05 12:12:35"  order by post.post_date desc limit 25
  

这里post_date可以抓取最后一条的post_date用来做下次获取的标记值。

但是问题是:如果我想通过view或者likeCount排序分批读取数据,获取的数据中没有可以用来做标记,拿来进行下次对比的标记值。

mysql语句如下:

SELECT post.*, user.user_avatar, user.user_name,

        (SELECT COUNT(*) FROM comment
        WHERE comment.post_id = post.post_id) AS commentCount,
        (SELECT COUNT(*) FROM post_like
        WHERE post_like.post_id = post.post_id) AS likeCount
  FROM post, user where post.user_id=user.user_id  order by likeCount desc limit 25
  

大家一般都是怎么解决的?谢谢

阅读 6.1k
3 个回答

limit n,m,表示起始值为n,然后取出m个记录。如果batch size为25,那么可以:
limit 25,limit 25,25,limit50,25 ... 依次下去,默认按照表的主键id升序排列,每次记录最大的已处理记录的主键id(这里基于了一个假设,此表是自增主键)

如果此表没有新增记录,以上方法肯定没问题,但是如果此表有多个事务并发写入,可能会导致大id记录先于小id记录(两个事务)被处理,导致这部分小id记录永远也不会被处理到。

问题中使用post_date其实也会有这个问题,无法保证post_date小的数据记录一定先于post_date大的记录先入库。insert时间早,id小的记录并不一定早于id大的记录插入至数据库。此完全取决于事务的提交时间。

列表的分页怎么实现的,这个就怎么实现。这个思路不会错

比如总共有110条数据,分页每页25条,那总共有5页。页面开始显示的是 select from post order by view desc limit 0,25获得的数据。页面上滑的时候加载第二页select from post order by view desc limit 25,25。加载更多的时候把limit第一个参数计算好应该就可以了。已经测试过了,是可以的。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题