硬核干货:TiDB 与 MySQL 执行计划差异 + 慢SQL调优排查手册(可直接落地)
前言
很多开发、DBA 在从 MySQL 迁移 TiDB、或者日常 TiDB 调优时,最大的痛点:
会看 MySQL 的 Explain,但是完全看不懂 TiDB 的 Explain,调优无从下手。
本质原因:
MySQL 是单机执行模型,TiDB 是分布式执行模型,两者的执行计划逻辑、字段含义、优化侧重点完全不一样。
本文一次性讲透:
1. MySQL 与 TiDB 执行计划核心区别
2. 字段一一映射对照表(快速上手)
3. 常见 SQL 问题在两种 Explain 中的对应表现
4. TiDB 专属慢 SQL 排查 + 调优命令大全(生产直接复制)
适合收藏:面试、迁移、日常慢 SQL 优化、TiDB 运维 全场景通用。
一、核心认知:两者执行模型根本不同
1. MySQL 执行模型(单机)
• 架构:Server层 + InnoDB存储引擎
• 计算特点:大部分计算在 MySQL Server 层执行
• Explain 核心关注点:
◦ 索引有没有命中
◦ 是否全表扫描
◦ 是否文件排序、临时表
• 一句话总结:看这条 SQL 在单机会不会慢
2. TiDB 执行模型(分布式)
• 架构:TiDB(计算) + TiKV(分布式存储)
• 核心机制:计算尽可能下推 TiKV 执行(Coprocessor 协处理器)
• Explain 核心关注点:
◦ 算子是否下推 cop[tikv]
◦ 哪些计算留在 root 节点(网关汇总)
◦ 统计信息是否准确
◦ 分布式任务拆分是否合理
• 一句话总结:看这条 SQL 在集群里分摊得匀不匀、网络开销大不大
关键结论:
MySQL 慢,多半是索引烂了;
TiDB 慢,多半是 没下推、统计不准、大量计算上 root。
二、MySQL Explain VS TiDB Explain 字段精准映射
1. 字段一一对应速查表
MySQL 字段 TiDB 等价含义 解读要点
id 算子缩进ID 缩进越深越先执行,自底向上
select_type 算子类型(Agg/Join/Union) 区分普通查询、子查询、聚合
table access object 对应表、索引、分区
type 扫描算子类型 TableFullScan / IndexScan / IndexRangeScan
key 实际使用索引 在 operator info 中查看索引名
rows estRows(预估行数) 偏差大=统计信息过时
filtered 过滤选择性 内置在算子 filter 逻辑中
Extra task + operator info TiDB 调优最核心字段
2. 两种 Explain 阅读逻辑差异
• MySQL 阅读顺序:从上到下,看 type > key > Extra
• TiDB 阅读顺序:从下到上,看 cop[tikv] / root 算子树
三、MySQL 经典慢SQL特征,对应 TiDB 表现
1. MySQL:Using filesort(文件排序)
• 问题:无法利用索引有序,Server 层排序
• TiDB 对应现象:
◦ 出现独立 Sort 算子
◦ 且 task=root(最致命,全网数据拉到 TiDB 排序)
• 优化:加联合索引,让排序在 TiKV 本地完成
2. MySQL:Using temporary(临时表)
• 问题:分组、去重、关联产生临时表
• TiDB 对应现象:
◦ HashAgg / HashJoin 大量上 root 节点
◦ 内存消耗高、网络吞吐大
3. MySQL:Using index(覆盖索引)
• 优势:无需回表
• TiDB 对应现象:
◦ 只有 IndexScan,无 TableReader
◦ 100% 下推 TiKV,性能最优
4. MySQL:type=ALL 全表扫描
• TiDB 对应:TableFullScan
• 生产大忌:大表全扫、无法分片过滤
四、TiDB 独有核心字段(调优必看)
1. task 字段(TiDB 灵魂)
• cop[tikv]:计算下推存储节点 ✅ 最优
• root:TiDB 网关汇总计算 ❌ 尽量减少
TiDB 优化第一准则:
能下推的全部下推,不让数据上来!
2. keep order
• keep order:true:扫描自带有序,无需二次排序
• keep order:false:无序返回,上层需要 Sort
3. stats:pseudo
• 伪统计信息 = 优化器瞎猜行数
• 直接导致执行计划错乱、索引选错、超级慢
• 解决方案:ANALYZE TABLE xxx;
4. EXPLAIN ANALYZE(TiDB 神器)
MySQL 无官方真实执行计划;
TiDB 可以 真实执行 SQL,展示实际行数、耗时、KV扫描次数,是调优第一工具。
五、TiDB 生产慢SQL排查全套命令(可直接复制)
1. 查看真实执行计划(首选)
-- 预估计划(不执行)
EXPLAIN SELECT * FROM test.t1 WHERE id>100;
-- 真实执行 + 耗时分析(调优必用)
EXPLAIN ANALYZE SELECT * FROM test.t1 WHERE id>100;
2. 慢查询日志分析
-- 查看慢查询配置
SHOW VARIABLES LIKE 'slow_query%';
SHOW VARIABLES LIKE 'long_query_time';
-- 临时调低阈值,抓更多慢SQL
SET GLOBAL long_query_time=0.1;
-- 查询集群慢SQL Top20
SELECT * FROM INFORMATION_SCHEMA.CLUSTER_SLOW_QUERY
WHERE query_time > 0.1
ORDER BY query_time DESC LIMIT 20;
3. 统计信息修复(解决90%计划跑偏)
-- 单表刷新统计
ANALYZE TABLE 库名.表名;
-- 整库刷新
ANALYZE DATABASE 库名;
-- 查看统计元信息
SHOW STATS_META WHERE table_name='表名';
4. 索引排查 & 无用索引清理
-- 查看表索引
SHOW INDEX FROM 库名.表名;
-- 查看索引实际使用率
SELECT * FROM INFORMATION_SCHEMA.TIDB_INDEX_USAGE;
5. hint 强制优化(应急救急)
-- 强制走指定索引
SELECT /*+ USE_INDEX(t,idx_col) */ * FROM 表名 t;
-- 禁止全表扫描
SELECT /*+ NO_FULL_TABLE_SCAN() */ * FROM 表名;
-- 强制合并连接(有序表关联更快)
SELECT /*+ MERGE_JOIN(a,b) */ * FROM t1 a JOIN t2 b ON a.id=b.tid;
6. 会话阻塞 & 杀会话
-- 查看活跃会话
SHOW PROCESSLIST;
-- 终止卡死慢查询
KILL 会话ID;
-- 查看集群节点负载
SHOW TIDB_SERVERS;
7. 分区裁剪排查
EXPLAIN PARTITIONS SELECT * FROM 分区表 WHERE pt='202605';
六、终极调优口诀(日常排查直接套)
MySQL 调优口诀:优先 ref、杜绝全表、少排序、少临时表
TiDB 调优口诀::多看 cop 少 root、索引扫描优先走、统计过期马上更、聚合排序尽量下沉
七、总结
1. MySQL Explain 看索引与单机开销;
2. TiDB Explain 看分布式下推与集群任务拆分;
3. TiDB 慢 SQL 90% 问题来自:未下推 + 统计信息失效 + 大量 root 计算;
4. 生产调优固定流程:EXPLAIN ANALYZE → 检查下推 → 校验统计 → 加索引下沉计算。
适合场景
• 面试回答 TiDB 与 MySQL 优化区别
• 业务 MySQL 迁移 TiDB 适配
• 日常 DBA 慢 SQL 排查手册
• 团队内部技术沉淀文档
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)