mysql:union all 两个子句,子句中包含order by结果乱序问题处理

场景:

生产上的mysql版本是5.7.28(使用select version();查阅)执行如下SQL,最终结果乱序

select * from (
    (select * from order_bj order by create_time asc)  t1
    union all 
    (select * from order_sh order by create_time desc)  t2
) t

 t1排序正常,t2排序异常

问题分析:

union 是先排序后去重,合并结果集;union all 不排序不去重,合并结果集;

以上这是百度出来的,字面理解这句话应该是没问题的,只要去重,肯定要先排序。按照union all在百度上的所说,是不应该乱序的

实际情况确实,union all出来的结果乱序的,还有就是我在公司的测服库上执行就没有这个问题存在,猜测可能跟数据库配置有关系,我测服的mysql版本是5.5.21

最终解决:

在子句中加上  limit 99999999   ,迎刃而解,不要问我为什么,我也不知道,这个问题并不是只有mysql有,SQL server同样存在,可以排除的一点是,跟mysql底层的 datapage(大小4KB)是没有关系的,当数据量过大,结果集远大于4KB时多个数据页的数据合并,可能回造成排序失效,但是从实际结果上看时全部乱序,不知道在什么样的处理逻辑中乱序处理了,并且limit不到100的结果集中也都是乱序的,问题解决了,原理不知

select * from (
    (select * from order_bj order by create_time asc  limit 99999999)  t1
    union all 
    (select * from order_sh order by create_time desc  limit 99999999)  t2
) t

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值