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() 进行调整。

➡️

继续阅读