SQL分页之数据重复出现

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哦~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值