返回
精读TiDB源码(二十一):基于规则的优化Ⅱ
见解分享
2023-10-26 20:55:28
TiDB 作为一款分布式数据库,在处理大量数据时,为了提升查询效率,采用了一系列基于规则的优化策略。在上一篇文章中,我们已经介绍了其中的几类规则:列剪裁、最大最小消除、投影消除、谓词下推和构建节点属性。今天我们再继续介绍另外三类规则:聚合消除、外连接消除和子查询优化。
聚合消除
聚合消除(Aggregate Elimination)是一种优化规则,它会检查 SQL 查询中是否包含聚合函数(如 SUM()、COUNT()、AVG() 等),如果存在聚合函数,则会尝试将不必要的聚合操作消除,以减少计算量并提高查询效率。
聚合消除规则通常适用于以下几种情况:
- 聚合函数的输入是常量或子查询的结果,这种情况下,聚合操作可以被直接计算出来,无需再对数据进行扫描。
- 聚合函数的输入是另一个聚合函数的结果,这种情况下,可以将两个聚合操作合并为一个,从而减少计算量。
- 聚合函数的输入是某个列的值,并且该列上存在唯一索引,这种情况下,聚合操作可以被转换成一个简单的索引查找操作,从而大大提高查询效率。
外连接消除
外连接消除(Outer Join Elimination)是一种优化规则,它会检查 SQL 查询中是否包含外连接操作(如 LEFT JOIN、RIGHT JOIN 等),如果存在外连接操作,则会尝试将不必要的外连接消除,以减少数据扫描量并提高查询效率。
外连接消除规则通常适用于以下几种情况:
- 外连接操作中,有一侧的表非常小,这种情况下,可以将外连接转换成一个简单的内连接,从而减少数据扫描量。
- 外连接操作中,有一侧的表上存在主键或唯一索引,并且另一侧的表上存在与该主键或唯一索引相等的外键,这种情况下,可以将外连接转换成一个简单的等值连接,从而提高查询效率。
子查询优化
子查询优化(Subquery Optimization)是一种优化规则,它会检查 SQL 查询中是否包含子查询,如果存在子查询,则会尝试将子查询重写成更优化的形式,以减少子查询的执行时间并提高查询效率。
子查询优化规则通常适用于以下几种情况:
- 子查询是相关子查询,即子查询中的列引用了外层查询中的列,这种情况下,可以将子查询重写成一个连接操作,从而提高查询效率。
- 子查询是可关联子查询,即子查询中的列与外层查询中的列存在相等关系,这种情况下,可以将子查询重写成一个半连接操作,从而提高查询效率。
- 子查询是可合并子查询,即子查询的结果可以被合并到外层查询中,这种情况下,可以将子查询重写成一个 UNION 或 INTERSECT 操作,从而减少查询的执行时间。
通过以上三类优化规则的介绍,我们可以看到 TiDB 在查询优化方面做了非常多的工作,这些优化规则可以有效地减少数据的扫描量、减少计算量并提高查询效率。在实际使用中,我们可以通过合理地使用索引、选择合适的查询策略等方法来帮助 TiDB 更好地进行查询优化,从而提高应用程序的性能。