坑!!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