mysql版本:5.7.25-OceanBase-v4.2.5.4
select * from ( select id,name,year from user order by year) a where name=‘123’ limit 0,10
这样的嵌套查询0,10查询出来的数据在10,10里面出现。是什么原因?
目前mysql没发现这个问题,切换到oceanbase出现的
mysql版本:5.7.25-OceanBase-v4.2.5.4
select * from ( select id,name,year from user order by year) a where name=‘123’ limit 0,10
这样的嵌套查询0,10查询出来的数据在10,10里面出现。是什么原因?
目前mysql没发现这个问题,切换到oceanbase出现的
ORDER BY
非唯一字段后,隐式地按主键排序,保证了结果集的确定性。year
相同时,这些行的相对顺序是不确定的,可能因执行计划、并行度、数据分布等因素而变化。WHERE name='123'
时,内层的排序已经不稳定,导致不同 LIMIT
分页之间可能出现重复记录或跳过记录。针对上述问题,OceanBase 4.2.1 BP2引入了分页保序功能,只在MySQL租户下可以使用,增加隐藏配置项_preserve_order_for_pagination、查询hint PRESERVE_ORDER_FOR_PAGINATION用于控制查询是否使用分页保序功能。
可以打开下面参数看下
alter system set _preserve_order_for_pagination = 1;
year 字段唯一吗,如果不唯一保证不了每次查询的结果是有序的
学习
因为MySQL默认按主键排序,OB不会,如果需要就排下序吧
启用保序参数,或者sql执行计划用hint写死,或者严格使用order by都可以保证有序。
这个问题看官方解释:采用不同的执行计划,数据吐出来先后顺序是不一样的,所以一旦执行计划改变数据肯定乱序。
实现原理不同啊