项目用了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
本文探讨了在使用MySQL 5.6版本进行分页查询时遇到的数据重复和错乱问题,尤其是在根据时间排序并使用limit分页时。文章详细解释了问题的原因,并提供了两种解决方案:一是为排序列添加索引并在orderby子句中明确指定主键id;二是加入第二个排序字段以提高排序的唯一性,确保排序字段在表中的值是唯一的。
737

被折叠的 条评论
为什么被折叠?



