坑!!orderBy排序一定要设置唯一的目标字段

先说结论:涉及到orderBy排序后分页的时候,orderBy要加上值为唯一的字段!

前言:我把排查思路、解决过程都记录下来了,需要改进的地方,敬请不吝赐教。

场景:

在切换前端分页时,发现前后两页存在重复的数据,但是页面上显示的结果条数却是正确的。

这个问题极其隐匿,特别是数据量大的时候很难发现,涉及到orderBy排序后分页的时候一定要留个心眼关注一下有没有存在这个问题。

排查思路:

1、将SQL复制到Navicat中执行,结果条数与页面上显示的条数一致,也不存在重复的数据。而直接执行与系统执行只差了一个分页操作,初步锁定问题与分页有关。

2、简化SQL语句,去掉了order by子句,再次切换页数,不存在重复的数据了,而且再次期间没有修改任何数据。所以基本可以判断是orderBy排序的结果有浮动导致加上分页的时候出现重复数据的问题。

问题原因:

orderBy排序的目标字段的值不唯一,会出现数据排序不稳定,以至于limit分页时出现数据重复。

如:order by name 姓名不是唯一的,可能有6个人都叫小明,这样就有可能出现重复数据的问题。

解决方法:

orderBy加上值为唯一的字段,一般加上id以保证orderBy的排序的唯一性,从而避免出现重复数据的问题。

如代码改为:order by name,id

文章不足之处还请斧正!

本文By:NonNullPointer --2022/03/23

最后修改:2022 年 03 月 23 日
如果觉得我的文章对你有用,请随意赞赏