SQL的执行过程

1 第一次执行select * from t,它是个本地执行计划。随后,t发生了切主,那么在第二次执行这个sql的时候,它的执行计划就变成远程执行计划?如果没有发生切主,那么第二次执行这个sql的时候,它的执行计划依然还是本地执行计划?

2 执行select * from a, b where a.id=b.id ,假如a在本地节点observer1,b在远程节点observer2。那么select * from a, b where a.id=b.id就会分解为 select * from a 和 select * from b 这两个SQL ?然后,select * from a就在本地节点observer1上执行,是本地执行计划; select * from b就在远程节点observer2上执行,并把执行结果返回给本地节点observer1? 整体执行计划是分布式执行计划?

  1. 如果直连了某个 observer,不走 proxy,那么你这个说法是对的。如果没有走 proxy 的话,你这个说法是对的。如果走了 proxy,proxy 可以尽量保证把 sql 路由到主所在的机器,每次都生成本地计划。

  2. 不会分解成2个sql。这会生成一个分布式的 join,是一个分布式计划。你可以通过下面的语句看到计划的样子:

explain select * from a, b where a.id=b.id

另外,对于第二个问题,你也可以思考下为什么不做成2个计划分别执行,然后融合在一起呢?

假设是10个表,分布在若干台机器上做非常复杂的 join,用你说的这种思路来做,怎么办?