Tidb的hint不生效

为提高效率,请提供以下信息,问题描述清晰能够更快得到解决:

【概述】 场景 + 问题概述
Tidb v4.0.11,某些语句hash join访问快,但是执行计划一直用的index join,加上hash join的hint也不生效。于是用测试环境写不同的hint查看执行计划,发现并不能生效
【背景】 做过哪些操作

【现象】 业务和数据库现象
选不同的hint,并没有生效,也没有绑定执行计划

MySQL [sbtest]> show bindings;
Empty set (0.00 sec)




【问题】 当前遇到的问题,参考 AskTUG 的 Troubleshooting 读性能慢-慢语句

【统计信息是否最新】

    【执行计划内容】

    【 SQL 文本、schema 以及 数据分布】

【业务影响】
走了错的执行计划,导致语句执行慢
【TiDB 版本】
v4.0.11
【附件】 相关日志及监控(https://metricstool.pingcap.com/)

  • TiUP Cluster Display 信息
  • TiUP CLuster Edit config 信息
  • TiDB-Overview Grafana监控
  • TiDB Grafana 监控
  • TiKV Grafana 监控
  • PD Grafana 监控
  • 对应模块日志(包含问题前后 1 小时日志)

执行计划是合理的,select count() 会进行聚合计算,聚合计算会将 count() 优化器会进行转化 count(id) 来计算。所以不会走到 hash join table 。如果不希望走索引,可以将 select count(*) 转化成 select * 来试试。

我想请教的是 hint 不能生效吗?如果完全按内部CBO去选择执行计划的话,HINT感觉用途不大,还是我使用错了方式么?

hint 生效前提是 join 逻辑是合理的,可以了解一下 SQL 优化器的 CBO 和 RBO 的逻辑。
我们使用 hint 的是测试?还是预期计划想走到哪个执行逻辑上面 ?
现在这个 SQL 的执行逻辑是 t1 和 t2 表 join 计算,因为 t1 和 t2 表选取数据量应该是基本相同,所以会走到 merge join 逻辑是合理的,从 RBO 逻辑里面应该不会走到 hash join 逻辑。

本地试了一下无法复现.
你是不是用了 SPM 呀, SPM 的优先级似乎会高于 hint ,导致 hint 失效

有些时候,hint是生效不了,MySQL就有这样的情况,不知道为啥