TiDB 慢查询日志中 Coprocessor 耗时过高如何定位瓶颈?

文章导读
Coprocessor 耗时过高通常意味着 TiKV 层数据处理压力大,优先通过 EXPLAIN ANALYZE 确认执行计划,再结合 TiDB Dashboard 查看具体算子耗时。适用场景为生产环境慢查询排查,风险边界在于在线执行 EXPLAIN ANALYZE 可能加重负载。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

Coprocessor 耗时过高通常意味着 TiKV 层数据处理压力大,优先通过 EXPLAIN ANALYZE 确认执行计划,再结合 TiDB Dashboard 查看具体算子耗时。适用场景为生产环境慢查询排查,风险边界在于在线执行 EXPLAIN ANALYZE 可能加重负载。

先说结论:定位 Coprocessor 耗时瓶颈的核心是区分计算耗时与等待耗时,并找到消耗资源最多的算子。

  • 先定位慢查询的具体算子耗时分布
  • 先做索引优化或 SQL 改写
  • 再验证执行计划是否变更

命令速用版

直接查询慢查询日志表获取最近耗时最高的 SQL,并使用 EXPLAIN ANALYZE 查看实际执行开销。

SELECT * FROM information_schema.slow_query WHERE time > NOW() - INTERVAL 1 HOUR ORDER BY query_time DESC LIMIT 5;
EXPLAIN ANALYZE SELECT * FROM your_table WHERE your_condition;

如果无法登录数据库,登录 TiDB Dashboard 慢查询页面,按 Cop_proc_avg 降序排列。

为什么会这样

Coprocessor 耗时高说明计算下推到了 TiKV 但处理慢,主要原因通常是扫描行数过多、索引缺失或数据热点。Coprocessor 请求包含 Cop_proc_avg(处理耗时)和 Cop_wait_avg(等待耗时),前者高代表 CPU 计算或 IO 读取慢,后者高代表 TiKV 忙或锁冲突。公开资料中没有看到可靠的量化数据说明具体阈值,需结合业务基线判断。

分步处理

第一步:确认慢查询类型。查看慢查询日志中的 Cop_proc_avg 和 Cop_wait_avg 字段。适用场景为初步筛选,操作动作是查询 information_schema.slow_query 表,验证结果是确定是计算慢还是等待慢,风险边界是无。

第二步:分析执行计划。对目标 SQL 执行 EXPLAIN ANALYZE。适用场景为确认算子开销,操作动作是运行命令,验证结果是看到每个算子的 actual rows 和 execution time,风险边界是该命令会真正执行 SQL,可能增加集群负载,避免在高并发时段对大表执行。

第三步:检查 TiKV 负载。登录 Grafana 查看 TiDB-Cluster->TiKV-Coprocessor 面板。适用场景为确认集群资源瓶颈,操作动作是观察 CPU 使用率和 Channel Full 次数,验证结果是确认是否存在热点或资源不足,风险边界是无。

TiDB 慢查询日志中 Coprocessor 耗时过高如何定位瓶颈?

第四步:优化索引或 SQL。根据 EXPLAIN 结果添加缺失索引或改写 SQL 避免全表扫描。适用场景为根本解决,操作动作是执行 CREATE INDEX 或修改代码,验证结果是执行计划变更,风险边界是创建索引可能占用磁盘 IO 和空间,建议在低峰期操作。

怎么验证是否生效

再次执行相同的查询,观察慢查询日志中 Cop_proc_avg 数值是否下降。登录 TiDB Dashboard 查看该 SQL 的平均执行耗时趋势图。检查 Grafana 中 TiKV Coprocessor 请求延迟指标是否回落。如果执行计划中扫描行数减少,通常意味着优化生效。

常见坑

避免在生产高峰直接对大表执行 EXPLAIN ANALYZE,该命令会触发真实查询,可能加剧拥塞。不要仅依赖 EXPLAIN 而不看 EXPLAIN ANALYZE,前者是预估,后者是实际耗时。索引创建完成后需等待统计信息更新,否则优化器可能仍选错计划,可手动执行 ANALYZE TABLE 触发更新。

常见问题

Cop_proc_avg 和 Cop_wait_avg 有什么区别?

Cop_proc_avg 是 TiKV 处理请求的实际计算时间,Cop_wait_avg 是请求在 TiKV 队列中的等待时间。前者高通常优化 SQL 或索引,后者高通常优化集群资源或解决热点。

为什么已经有索引 Coprocessor 耗时还是高?

可能是索引区分度低导致扫描行数依然过多,或者发生了索引下推计算量过大。需要检查 EXPLAIN ANALYZE 中的 actual rows 是否远大于预期。

如何判断是否是数据热点导致的?

查看 Grafana 中 TiKV-Details->Hotspot 面板,如果某些 Region 的 QPS 或 CPU 远高于其他 Region,则存在热点。可通过打散热点数据或调整调度策略处理。

参考来源

  • PingCAP 官方文档 - 慢查询日志:https://docs.pingcap.com/zh/tidb/stable/slow-query-log
  • PingCAP 官方文档 - EXPLAIN ANALYZE:https://docs.pingcap.com/zh/tidb/stable/explain-analyze
  • PingCAP 官方文档 - TiDB Dashboard 概述:https://docs.pingcap.com/zh/tidb/stable/dashboard-overview