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() 进行调整。
❓
延伸问答
TiDB 如何优化子查询的执行性能?
TiDB 通过多种优化策略提升子查询的执行性能,包括半连接和关联子查询的优化,提供自动优化和 HINT 选项。
什么是半连接,TiDB 如何实现它?
半连接是一种只关心外表记录是否在内表中有匹配的连接操作,TiDB 可以通过 EXISTS 子查询、IN 子查询或直接转换为 JOIN 操作实现。
TiDB 中的子查询去关联优化有什么优势?
子查询去关联优化可以减少重复执行,提高执行效率,但在数据量小的情况下可能效果不佳。
在什么情况下 TiDB 的半连接优化可能效果不佳?
当子查询结果集大于外查询时,选择 Hash Join 可能导致执行速度不及预期,且在数据量小的情况下,去关联优化可能效果不佳。
TiDB 提供的 semi_join_rewrite() HINT 有什么作用?
semi_join_rewrite() HINT 可以改善优化器的选择范围,帮助选择更高效的执行方式,尤其在处理 EXISTS 子查询时。
关联子查询的特点是什么?
关联子查询与外部查询有关联,信息流双向,外部查询每行数据传递给子查询,且每次外部查询返回一行数据时,内部查询执行一次。
➡️