TiDB 5.4 升级 7.1 后出现 SQL 执行计划突变为什么?

文章导读
TiDB 从 5.4 升级到 7.1 跨越了多个大版本,优化器内核的成本模型和规则引擎发生了迭代,导致部分 SQL 执行计划出现变化属于预期行为。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

TiDB 从 5.4 升级到 7.1 跨越了多个大版本,优化器内核的成本模型和规则引擎发生了迭代,导致部分 SQL 执行计划出现变化属于预期行为。

先说结论:执行计划突变主要源于优化器升级带来的成本计算差异,优先使用 SQL Bind 固定计划可快速止血。

  • 先定位:通过慢查询日志锁定计划变化的具体 SQL
  • 先处理:使用 CREATE BINDING 强制指定旧版本执行计划
  • 再验证:执行 EXPLAIN 对比算子类型确认绑定生效

命令速用版

直接通过 SQL 绑定功能恢复原有执行计划,无需回滚版本。

SHOW PLAN_BINDS;
CREATE BINDING FOR <原 SQL> USING <带 Hint 的 SQL>;
ADMIN CAPTURE BINDINGS;

为什么会这样

TiDB 7.1 版本默认启用了更激进的新成本模型,且优化器规则相比 5.4 版本有明显增减。

TiDB 5.4 升级 7.1 后出现 SQL 执行计划突变为什么?

5.4 到 7.1 之间经历了 6.x 系列的优化器重构,包括连接重排序(Join Reorder)逻辑改进和统计信息采样策略调整。公开资料中没有看到可靠的量化数据表明性能一定提升或下降,但计划形状改变是版本升级的常见副作用。

分步处理

按照定位、绑定、统计信息更新的顺序处理,避免盲目调整参数。

TiDB 5.4 升级 7.1 后出现 SQL 执行计划突变为什么?
  1. 锁定问题 SQL:查询 INFORMATION_SCHEMA.SLOW_QUERY 表,找到升级后耗时突增的语句。
  2. 对比执行计划:分别在测试环境 5.4 和 7.1 版本对该 SQL 执行 EXPLAIN,记录算子差异。
  3. 创建绑定:在 7.1 集群使用 CREATE BINDING 语句,将 SQL 绑定到 5.4 版本的优秀计划或指定 Hint。
  4. 更新统计信息:执行 ANALYZE TABLE 命令,确保优化器基于最新数据分布计算成本。

怎么验证是否生效

通过 EXPLAIN 命令检查 Plan 字段是否包含 binding 标识,并观察业务延迟是否回落。

  • 执行 EXPLAIN <SQL>,检查输出中是否显示使用了 Binding。
  • 监控 Grafana 面板中该 SQL 的 Query Duration 指标。
  • 检查 TiDB 日志中是否有 Plan Bind 相关的加载记录。

常见坑

统计信息过期和绑定语句语法错误是导致处理失效的主要原因。

  • 绑定语句中的表名必须包含数据库名,否则可能匹配失败。
  • 升级后未重新收集统计信息,导致优化器基于旧直方图计算成本。
  • 部分 Hint 语法在不同版本间存在兼容性差异,需查阅对应版本文档。

常见问题

升级后能否直接回滚版本?

不建议直接回滚,数据兼容性风险高于计划突变风险。

TiDB 5.4 升级 7.1 后出现 SQL 执行计划突变为什么?

统计信息会自动更新吗?

TiDB 有自动分析机制,但大版本升级后建议手动触发一次 ANALYZE。

绑定计划会影响其他 SQL 吗?

SQL Bind 仅对精确匹配或模板匹配的特定 SQL 生效,不影响全局。

参考来源

  • TiDB Official Documentation, Release Notes, https://docs.pingcap.com/tidb/stable/release-notes
  • TiDB Official Documentation, SQL Plan Management, https://docs.pingcap.com/tidb/stable/sql-plan-management