今天使用 sqlserver 的 order by key + 分页 搞出来一个分页出现重复数据的 bug,这显然是很奇怪的
场景:
select id from A (你随便在你的数据库找一张表)order by key (其中这个 key 有大量的重复值,类似 status 字段,或者 type 字段)
也就是说把按照某列排序,这列的值相同概率很高(或者你测试的时候这列值完全都是相同的)
然后开始测试排序是否是稳定的:
select Top 10 id from A (你随便在你的数据库找一张表)order by key
select Top 20 id from A (你随便在你的数据库找一张表)order by key
select Top 30 id from A (你随便在你的数据库找一张表)order by key
select Top 100 id from A (你随便在你的数据库找一张表)order by key
结果集的前 10 条数据,是否是永远不会变的,就是那个前 10 条 id 顺手是否永远不变,如果这 10 条永远是不变的,说明排序是稳定的
然后可以再测下分页 看看数据会不会重复出现
分页的算法也许和 top 不一样,会用什么快速排序定位,其中这个 key 的列值全部都是一样的,你可以用类似 isdelete 字段测
select id from A limit 1,10 order by key
select id from A limit 10,10 order by key
select id from A limit 20,10 order by key
看看分页是不是有问题,会不会出现重复的 id
大家手头现成的数据库顺便找个有数据的表,就能测了
大家把数据库的版本贴出来,看看都是怎么样的
网上对于这种的说法很多
比如在 mysql 中:
如果结果都一样就按照系统默认的排序排。
如果是 innodb 引擎,会根据主键大大小,由小到大;
如果是 myisam 引擎,就根据数据插入顺序先后来排。
还有人说在 oracle 中:
9i 中是按照 rowid 进行排序的,10g 以后就不是了
大家都测下呗,这个坑会导致分页出现重复的情况!,不能忍啊!
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于