请问top sql里执行计划有很多个,有些SQL 2个执行计划,有些SQL 几十个执行计划,这个怎么解决呢?
另外想咨询下tikv里执行的SQL全部都是全表扫描,如果字段有索引,tikv也会走索引吗?
看看表健康度,是不是健康度太低,导致没有走正确的执行计划。
这个应该不是吧,有索引,应该走索引啊。不过要注意,索引匹配机制是按从左到右匹配,意味着条件里必须包含索引第一个字段,才会匹配这个索引。
可以直接贴一下有疑问的执行计划
问题感觉提得有点泛泛,能不能举几个实际的例子,大家也好方便实践和帮忙分析呢,贴点日志也是好的,说不定可以找到些蛛丝马迹的
可以试一下使用 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条件是不是不同,就应该走不同执行计划
用 EXPLAIN ANALYZE 找最优计划,通过 CREATE PLAN_BINDING 固定;定期 analyze table 校准统计信息。
CREATE PLAN_BINDING 语法是怎么样呢?
analyze table 我记得是每天有自动执行的吧
对, 一般where条件如果带了其他索引可能走偏了
官方文档中有描述