场景:
生产上的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