SQL分页之数据重复出现
问题现象
一个分页列表页面,业务场景上不会出现重复数据,但从页面展示上看,不同页出现同一条数据,列表总条数没有问题。
排查思路
数据库本身就有重复脏数据?
通过分页接口找到后端sql,去掉分页相关参数,数据库执行,发现查出来的总数跟页面能对上,但查询结果并没有重复数据。
后端处理逻辑替换成了重复数据?
看后端逻辑直接查出来就返回给前端了,前端也是直接绑定列表属性,没有做任何业务处理。
确定是sql分页问题
在后端sql加上分页参数,分别执行第一页和第三页sql,发现果然出现了重复数据。
至此明显发现了是sql排序问题,在分页sql中,如果不显示指定order by则sql执行时结果的排序不可控。
解决方案
手动加上了order by,问题解决
原因
在我的固有思维里,如果一条sql不显示指定order by,那它默认应该根据主键排序,不应该出现这个问题才对。
既然这个问题出现,那我的固有思维方式就是不对的。那在sql未显示指定order by的情况下,查询结果究竟是按什么排序的呢?带着疑问我查找了相关材料,以下是一个解释得比较明白的:
大致意思是说:在sql中,顺序并不是数据集合的固有属性,因此你不要寄希望于RDBMS给你返回一组有顺序的数据,如果你想要有顺序的结果,除非你使用order by指定。而且所有数据库的都是这样,不仅仅是mysql,如果sql中未指定order by那结果的顺序取决于底层依赖。
如果select走了索引,那会按索引排序吗?这问题我也帮大家查了,答案是:
There is no default sort order. Even if the table has a clustered index, you are not guaranteed to get the results in that order. You must use an order by clause if you want a specific order.
也就是说不能保障顺序,所以还是老老实实的加order by吧!
总结
分页场景记得指定order by哦~