请问top sql里执行计划有很多个,这个怎么解决呢?

请问top sql里执行计划有很多个,有些SQL 2个执行计划,有些SQL 几十个执行计划,这个怎么解决呢?
另外想咨询下tikv里执行的SQL全部都是全表扫描,如果字段有索引,tikv也会走索引吗?

1 个赞

看看表健康度,是不是健康度太低,导致没有走正确的执行计划。

:thinking:这个应该不是吧,有索引,应该走索引啊。不过要注意,索引匹配机制是按从左到右匹配,意味着条件里必须包含索引第一个字段,才会匹配这个索引。

可以直接贴一下有疑问的执行计划

问题感觉提得有点泛泛,能不能举几个实际的例子,大家也好方便实践和帮忙分析呢,贴点日志也是好的,说不定可以找到些蛛丝马迹的

可以试一下使用 EXPLAIN ANALYZE 找到最优的执行计划,然后通过 SQL BIND 将其固定。

对 SQL 执行 EXPLAIN ,查看是否有 IndexScan 算子。如果没有,说明优化器认为没有合适的索引或全表扫描更优

检查你的 WHERE 条件,尝试建立合适的索引,或者调整 SQL 写法以利用现有索引

TiDB 中同一 SQL 出现多个执行计划,核心原因是 SQL 存在 “参数化差异”(如不同绑定变量、不同过滤条件)、统计信息不准确、优化器参数波动 ,导致优化器生成不同执行计划(部分可能是低效计划,如全表扫描)。解决思路是「统一执行计划、消除参数化差异、稳定优化器选择」

很可能是过滤条件不同导致选了不同的计划,如果一直是某个计划最优的话,可以考虑 binding

use index指定索引?

SQL BIND 是不是要dba才有权限处理

where条件也相同吗? 是不是带其他索引字段了?

-- 1. 找到该 SQL 的最优执行计划(通过 EXPLAIN 或 Top SQL 中的计划 ID)
EXPLAIN ANALYZE SELECT * FROM t WHERE id = 123;  -- 先执行得到最优计划

-- 2. 绑定计划(替换为你的真实 SQL 和计划哈希)
CREATE PLAN_BINDING FOR 
  SELECT * FROM t WHERE id = ? 
USING 
  SELECT * FROM t USE INDEX (idx_id) WHERE id = ?;  -- 显式指定索引,固定计划

-- 3. 验证绑定是否生效
SELECT * FROM INFORMATION_SCHEMA.PLAN_BINDINGS;

把相关表analyze分析下,如果还有很多执行计划,那具体看where条件是不是不同,就应该走不同执行计划

1 个赞

EXPLAIN ANALYZE 找最优计划,通过 CREATE PLAN_BINDING 固定;定期 analyze table 校准统计信息。

CREATE PLAN_BINDING 语法是怎么样呢?

analyze table 我记得是每天有自动执行的吧

对, 一般where条件如果带了其他索引可能走偏了

1 个赞

官方文档中有描述

1 个赞