问题产生环境说明
服务器Mysql版本:5.7
前端需要对某个表的内容根据某一个字段的值进行分页排序显示。
先排序使用到了 order by ,后分页取一页的数据使用到了 limt。
问题的出现
当前端进行显示时,出现部分排序错误,甚至是重复数据将原本正常的数据覆盖的情况。这里服务器已经调整好了就不放错误对比图了。
问题产生的原因
我认为本质上是mysql设计上的问题,根据msql官方文档对order by 和 limit的说明:如果order by的列有相同的值时, mysql会随机选取这些行,具体根据执行计划有所不同;limit 获取指定行区间的数据。
当我们先用order by再使用limit时,因为分页显示是每一页都要再次获取,如果用以排序的字段有多个相同值,根据order by的机制,就会造成这些字段相同行的排序错误甚至是重复排序。
问题解决
知道了产生bug的原因,就是问题的解决了。为了满足当前的需求,给大家提供两种解决方案:
- 升级Mysql版本,我在本地使用8.0+的版本就不会有这个问题。
- 增加第二排序字段,如select id,sno,score from student order by score desc,id asc limit a,b 。增加的排序字段最好是主键或者唯一值的字段,这样不会重复就没有问题了。