AnalyticDB for MySQL和大多数主流商业数据库类似,会对每一条查询语句生成优化后的查询执行计划,包括计算的算子选择和表连结顺序等。本文主要介绍AnalyticDB for MySQL中的执行计划分类。

AnalyticDB for MySQL中的执行计划有:Join Order、Join Type、Join Method、Access Method、Data Shuffle、Aggregration等算子,以下详细介绍各类执行计划。

Join Order

根据查询的负载特征,AnalyticDB for MySQL提供多种关联顺序(Join Reordering)策略,主要包括Left Deep Tree (LDT)与Bushy Tree (BT)两种。其中,LDT一般适用于连结表分区对齐、优化开销相对较小、查询相对简单的场景。BT一般适用较复杂的查询场景,需要相对更长的优化时间。

说明 在AnalyticDB for MySQL中Join的Outer Table和Inner Table分别称为左表和右表。

Join Type

AnalyticDB for MySQL中Join Type包括Inner Join、Left Outer Join、Right Outer Join、Full Outer Join、Semi/Anti Join。对应在EXPLAIN中的计划输出分别为:InnerJoin、LeftJoin、RightJoin、FullJoin、SemiJoin。

说明 Anti Join在AnalyticDB for MySQL中显示为Semi Join加Filter。

Access Method

AnalyticDB for MySQL中的单表访问默认为Index Access(通过Filter下推),充分使用了AnalyticDB for MySQL全索引设计的优势,因此在查询计划中不做特别区分,一般标注为TableScan。某些特定场景可以通过指定No Index Hint规避使用索引。

Data Shuffle

在AnalyticDB for MySQL的MPP Share Nothing执行架构下,根据查询以及数据分布特性,会出现对数据进行重分布(Data Shuffling)的需求,包括对基表数据以及查询中间结果的数据重分布。在AnalyticDB for MySQL中,Data Shuffling包括Broadcast和Repartition两种数据重分布策略,对应的EXPLAIN的计划输出分别为RemoteExchange[REPLICATED]和RemoteExchange[REPARTITION],RemoteExchange[GATHER]算子对应数据汇集。

Aggregation

无论是Data Warehouse的Batch Query还是Interactive Query,都会涉及到多种Aggregation(聚合)计算。在AnalyticDB for MySQL中,这些聚合算子在EXPLAIN的计划中输出为Aggregation,并会标注具体的聚合算子类型。此外,对于分布式聚合计算,AnalyticDB for MySQL会根据数据特性来决定是否拆分为多步分布式聚合计算。