在2022-1.17该版本中,explain某些查询sql,例如
EXPLAIN SELECT * FROM db1.travelrecord WHERE id = 1;
id是分片键
可以看到有两个执行计划
上面的执行计划是ColocatedPushDown.它是根据具体SQL,而非SQL模板(带?的SQL)得出需要扫描的分表,如果所需的物理表都在同一个目标,同时满足以下关系
SQL中涉及的表满足一个分片(分表)与一个分片(分表)关联查询(使用分片条件达成)
每个逻辑表只涉及一个分表
逻辑表是相同目标的单表或者全局表
那么就把整个SQL中的表名改写,直接下发到mysql中执行
在分库分表的业务系统中,此类SQL应该占大多数,他们不需要扫描所有分表,只有一个sql就可以查询单个数据库中的分表,单表,全局表的结果.
[MYCAT2 分片表JOIN]https://www.yuque.com/docs/share/4afc54eb-65a6-4486-8e37-31210bd57f46?#
中的后两种情况,就是使用该优化,动态地把整个SQL下发到MySQL中执行
该优化在1.21初始版本就存在,到2022-1.17才添加输出执行计划显示