区分客户端与 JDBC 执行差异,TiDB 哪些参数影响数据回传链路耗时

相同 SQL、相同执行计划,TiDB 本地客户端执行速度正常,Java 应用 JDBC 调用却耗时严重,监控指向 LocalStream、结果集拉取、任务队列等待耗时过高,集群硬件资源充足。想了解 TiDB 中负责数据回传、流处理、任务调度的相关参数,该如何配置优化这类链路层面的性能问题?

mysql 客户端默认流式逐行拿数据;JDBC 驱动默认一次性拉完所有结果缓存 JVM,导致 TiDB 的 LocalStream 堆积、队列阻塞,耗时陡增。

调大扫描 / 执行并发、Chunk 批次、流水线队列关闭流控与索引串行扫描,扩容查询内存、放宽网络超时,消除流与队列等待。

JDBC 默认全量缓存结果,易造成流与队列阻塞。调大 chunk 大小、并发数、流水线队列,关闭流控,也可修改 JDBC 为流式拉取。

建表用SHARD_ROW_ID_BITS打散写入热点。

点赞收藏,深度好文

TiDB 的 LocalStream 是指 Server 内部把 Executor 产出的 Chunk 流式写回客户端时的流控/等待阶段。LocalStream Wait高 ≠ TiKV 慢,而是 TiDB 在等客户端把前面结果取走(或 TCP 可写)。你遇到的现象,99% 是 JDBC 未开启流式 Fetch 导致 TiDB Chunk 回传被阻塞,解法在 JDBC 侧配置 setFetchSize(Integer.MIN_VALUE),辅以合理的 tidb_max_chunk_size

优先调整tidb_max_chunk_sizetidb_stream_concurrency等会话参数优化数据分片与流式并发,再调大流水线、TiKV 读线程及 GRPC 相关参数,提升数据回传与任务调度能力,解决 JDBC 链路耗时问题。

并行执行依赖Region级并发扫描。

此话题已在最后回复的 7 天后被自动关闭。不再允许新回复。