项目用了mysql5.6 版(5.6.39),查询某个表时根据时间排序,用limit分页时发现当前页的某项数据在下一页偶尔也会出现,导致我们认为本该出现的数据没有出现(即所谓“丢失”)。并且每次limit不同的页导致有部分数据总数变化,其本质是一样的,都是数据错乱。到网上搜索了一些资料:
发现,我们order by 排序的时候,如果排序字段中有多行相同的列值,则排序结果是不确定的
问题解决方式如下:
最简单的方法就是在排序列上加索引,然后在 order by 上明示 主键id,问题就能解决。
或者
MySQL 使用 limit 进行分页时,可能会出现重复数据,通过加入 order by 子句可以解决,但是需要注意的是,如果排序字段有相同值的情况下,由于排序字段数据重复,可能会导致每次查询排序后结果顺序不同,分页还是会出现重复数据,这时可以加入第二个排序字段,提高排序的唯一性,最好保证排序的字段在表中的值是唯一的,这样就可以少写一个排序字段,增加查询效率,因为 order by 后面有多个排序字段时,无法用到索引。
参考以下资料:
MySQL · 答疑解惑 · MySQL Sort 分页 http://mysql.taobao.org/monthly/2015/06/04/
解决 MySQL 分页数据错乱重复 https://www.cnblogs.com/glon/p/6806064.html
解决mysql分页数据错乱问题 https://www.cnblogs.com/self-studyRen/p/9295724.html