文章目录
- 背景
-
- SQL 优化情况
- 线上SQL运行情况
- 分析
-
- 怀疑1:执行计划绑定问题?
- 尝试:SHOW WARNINGS 查看警告
- 探索 TiDB 的 USE_INDEX 写法
- Hint 不生效问题排查
- 解决
- 参考
背景
项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。
UAT 环境已经生效,但 PROD 环境强制索引未生效。究竟是什么原因导致的呢?🤣🤣🤣
SQL 优化情况
有这样的一个SQL:cbt 表和 cbti 表使用 order_key 进行 left join
SQL 执行计划:可以看到 cbti 表使用的是 idx_counpon_code 索引,查询条件中有 counpon_code IS NOT NULL 这个条件,所以走了这个索引。但这个执行计划是索引全扫描,所以性能非常低下。我们其实可以使用表中的 order_key 索引。
优化后执行计划:添加 /*+ USE_INDEX(cbti, cpos_bk_tob_item_order_key_IDX)