mybatis分页查询会有重复数据问题排查

先谈谈会出现分页导致重复数据的情况

1,使用一个没有值的字段排序,分页大可能出现重复

2,使用一个值都一样的字段排序,分页大可能出现重复

3,使用一个固定值的字段排序,分页大可能出现重复

4,排序字段都有值,值不唯一,分页一般不会出现重复

5,使用一个值不唯一的字段排序,分页可能出现重复,如果再增加非唯一字段的排序,大可能会出现重复

解决办法:排序字段加一个值唯一的字段作为排序,不会出现重复

问题分析:在MySQL 5.6及以后的版本上,优化器在遇到order by limit语句的时候,做了一个优化,即使用了priority queue。使用 priority queue 的目的,是在不能使用索引有序性的时候,如果要排序,并且使用了limit n,那么只需要在排序的过程中,保留n条记录即可,这样虽然不能解决所有记录都需要排序的开销,但是只需要 sort buffer少量的内存就可以完成排序。

之所以5.6出现了第二页数据重复的问题,是因为 priority queue使用了堆排序的排序方法,而堆排序是一个不稳定的排序方法,也就是相同的值可能排序出来的结果和读出来的数据顺序不一致。5.5 没有这个优化,所以也就不会出现这个问题。

也就是说,mysql5.5是不存在本文提到的问题的,5.6版本之后才出现了这种情况。

总结:所以在今后的代码当中,一定要主要分页是否会用到排序,如果用到排序,一定要增加一个值唯一的字段作为排序,不然就会导致分页有重复数据。

posted @ 2023-03-14 17:00  张亮java  阅读(1463)  评论(0编辑  收藏  举报