举例:
其他常见数据库union all 连接多个select 语句,结果集按select 语句出现的顺序排列,而tidb是乱序的,这个应该和分布式数据库特性无关吧,建议改进下
你可以加order by,不加order by不代表排序,数据库这样返回也没问题吧,不同数据内部实现不同,可能会有不同表现。
这里不需要排序操作就是按select顺序排列结果集
sql语义上没有排序啊
我也遇到过,但是不影响使用
是没有,union all语义是把select a结果集和select b结果集放一起输出,大部分数据库都是按照先a在b顺序,和select先后顺序有关系,比如mysql8:
或者Oracle:
结果是可以预期的
属于正常现象,因为需要从多个节点进行数据汇总,返回的数据顺序有出入,需要自己制定排序规则
这种sql应该不涉及多个节点的数据汇总
https://dev.mysql.com/doc/refman/5.7/en/union.html#union-order-by-limit 中有专门提到 order 的顺序问题
https://dev.mysql.com/doc/refman/8.0/en/union.html 中似乎都去掉了,可能 mysql 8.0 改过逻辑了
目前 tidb 还在做 mysql 8.0 的适配,可以看看 v7.5 发版后的情况。
不存在多节点汇总,都是同一个tidb server汇总的
union 和union all逻辑不一样,union 要去重,就是数据要汇总做hash或者排序的,union all并不用的
这是分布式多节点获取数据的特点
不是分布式特点,因为不涉及排序,就像我的例子,不涉及从tikv取值问题
对,原本就是这个样子的
看我后面的4 1 3 4 1 3例子 并不是排序
在 SQL 的语义中,只有使用了 order by 语法才会保障结果集的顺序输出。而单机数据库由于数据都存储在一台服务器上,在不进行数据重组时,多次执行的结果往往是稳定的,有些数据库(尤其是 MySQL InnoDB 存储引擎)还会按照主键或索引的顺序进行结果集的输出。TiDB 是分布式数据库,数据被存储在多台服务器上,另外 TiDB 层不缓存数据页,因此不含 order by 的 SQL 语句的结果集展现顺序容易被感知到不稳定。想要按顺序输出的结果集,需明确地把要排序的字段添加到 order by 子句中,这符合 SQL 的语义。
和order by无关,这里不涉及对结果集排序