分页查询导致数据重复的原因分析

诡异,OB的Limit分页不对呢

环境:
MySQL 5.7.25-OceanBase-v4.2.5.4
同一个SQL,在原生MySQL和OB表现不同

问题SQL:

select * from (
  select id,name,code from user order by code
) a where name='123' limit 0,10

第1页(0,10)出现的某条数据
竟然又在第2页(10,10)出现了!:ghost:
在纯MySQL没问题,切到OB就见鬼

  1. OB的排序稳定性问题?
  2. Limit分页实现机制不同?
  3. 还是这个版本的特有bug?

有没有老司机遇到过类似问题?
这是feature还是bug啊?
临时解决方案有哪些?

OB如果想要分页查询数据不重复需要排序字段是唯一的,不然会出现你说的问题

1 个赞


https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000002013547

不保证有序的原因是OB按索引扫的,而MySQL保证有序是因为MySQL按主键扫的。所以你ob要保证有序就需要进行排序后limit

跟什么扫描没关系,MYSQL如果排序字段非唯一会进行二次排序,但是OB只会进行一次排序,这个是行为上的区别

1 个赞

针对上述问题,OceanBase 4.2.1 BP2引入了分页保序功能,只在MySQL租户下可以使用,增加隐藏配置项_preserve_order_for_pagination、查询hint PRESERVE_ORDER_FOR_PAGINATION用于控制查询是否使用分页保序功能。

可以打开下面参数看下
alter system set _preserve_order_for_pagination = 1;

1 个赞