TiDB如何准确评估每个SQL的最优执行计划?

基于代价来评估。
优化器首先会对SQL执行Point_Get判断,如果是主键或者唯一索引上的查询,那没什么好评估的,就是最优的了
然后进行逻辑优化,对SQL进行等价改写,消除一些冗余逻辑,外连接改内连接等等
最后根据表的统计信息,选择代价最低的执行计划。这里的代价是基于SQL执行时可能消耗的CPU、I/O等资源并结合表的统计信息、索引情况等综合计算出来的。举个例子,一个SQL涉及a、b、c三张表之间的INNER JOIN,三张表相互关联的顺序有3*2=6种可能,表与表之间进行JOIN的方式有4种可能(HashJoin/MergeJoin/IndexJoin/IndexHashJoin),那三张表JOIN的方式一共就是6*4*2=48种可能(每种关联顺序有2个JOIN点,每个JOIN点有4种方法可选),优化器需要基于每张表的大小、关联字段及其它字段的索引、索引的筛选能力、执行时的资源消耗,从这至少48种执行计划中,选择执行代价最小的一个。从这个过程也可以看出,统计信息的准确性对优化器评估最优执行计划起着至关重要的作用

1 个赞