由于MySQL8开始支持并行查询,希望MySQL8支持Union All合拼结果集并行处理
Union All合拼分片表分区规则
在不跨数据库的情况下,涉及到多个分表合拼的时候,可以有多个选择,常用的是在Mycat中开启多个后端连接然后使用把返回的行汇总在一起或者在数据库中使用集合运算把分表的数据汇总.上述两种,Mycat2都支持.
在同一个数据库上涉及多个分表,Mycat2会使用union all语法把多个生成的SQL连接起来生成一个新的SQL让数据库执行.
Mycat2可以配置生成的每个SQL中出现union all的数量,默认值是
-1(v1.21-2021-11-30),不合拼,mycat并行获取存储节点数据
5(1.20)它可以汇总6个SQL(表),假如一年分12个表,5个union all可以汇总半年数据.
测试集保留5作为默认测试值
在数据库中的union all实际运行效率取决于存储节点的实现,而不使用union all汇总的数据使用多个连接并行查询汇总或者一个连接依次读取行数据汇总.
另外,union all可以大大减少后端数据库连接的使用量.
每个sql使用的union all数量可以在server的配置中更改
过多union all下推可能导致mysql存储节点计算耗时过长,所以需要调整server.json的mergeUnionSize参数
基于表类型的下推规则(v1.21-11-30)
该规则不区分union all还是union distinct
左表 | 右表 | 必要下推条件 |
---|---|---|
单表 | 单表 | targetName相同 |
单表 | 全局表 | |
单表 | 分片表 | targetName相同 |
全局表 | 单表 | |
全局表 | 分片表 | 分片表条件带有分片键命中一个分区 |
全局表 | 全局表 | |
分片表 | 全局表 | 分片表条件带有分片键命中一个分区 |
分片表 | 单表 | targetName相同 |
分片表 | 分片表 | 两分片表分别带有条件带有分片键命中一个分区,而且两个分区的 targetName相同 |
分片表与分片表下推union 例子
//分片表与分片表union 下推,都必须有带有分片条件
select 1 from db1.sharding where id = 1 union all select 1 from db1.shardin2g where id = 1