TiDB 关联子查询及半连接的优化实践
💡
原文中文,约41100字,阅读约需98分钟。
📝
内容提要
TiDB 针对子查询进行了多种优化以提升执行性能,包括半连接和关联子查询。TiDB 提供自动优化和 HINT 选项,半连接关注外表记录是否匹配内表,优化器可选择 Hash Join 或 Index Join。此外,TiDB 支持子查询去关联优化,减少重复执行,提高效率,但在数据量小的情况下可能效果不佳。
🎯
关键要点
-
TiDB 针对子查询进行了多种优化以提升执行性能,包括半连接和关联子查询。
-
TiDB 提供自动优化和 HINT 选项,半连接关注外表记录是否匹配内表。
-
优化器可选择 Hash Join 或 Index Join 来执行半连接。
-
TiDB 支持子查询去关联优化,减少重复执行,提高效率。
-
在数据量小的情况下,子查询去关联优化可能效果不佳。
-
半连接只关心外表记录是否在内表中有匹配,而不关心匹配记录的数量。
-
半连接可以通过 EXISTS 子查询、IN 子查询或直接转换为 JOIN 操作实现。
-
优化器在选择 Hash Join 时,子查询结果集大于外查询时,执行速度可能不及预期。
-
TiDB 提供 semi_join_rewrite() HINT 来改善优化器的选择范围。
-
在 Index Join 的情况下,外查询作为驱动表,子查询结果集小时,执行速度可能不佳。
-
关联子查询是与外部查询有关联的子查询,每次外部查询返回一行数据,内部查询执行一次。
-
TiDB 默认尝试进行子查询去关联,以提高执行效率。
-
在外部值较少的情况下,不解除关联依赖可能更有利于性能。
-
全局关闭子查询去关联可以通过将规则加入黑名单实现。
-
TiDB 针对半连接的优化可能在某些场景下未达到最佳性能,需使用 SEMI_JOIN_REWRITE() 进行调整。
➡️