Navicat 的“Query took”是客户端总耗时,包含网络传输、服务端执行和客户端解析,无法分离纯网络等待时间;定位网络问题需对比服务端本地执行耗时,并用ping、mtr等工具检测网络质量。
navicat 本身不暴露网络等待时间(如 tcp 连接建立、ssl 握手、数据包往返延迟等),它显示的 query took x sec 是**客户端从发送请求到收到完整结果的总耗时**,包含网络传输 + 服务端执行 + 客户端解析三部分,无法拆分出纯网络 wait 时间。
Navicat 底部显示的 “Query took” 包含哪些阶段
这个数值是客户端侧的 wall-clock 时间,由 Navicat 自身计时器测量,起点是 SQL 发送前一刻,终点是最后一行结果接收完毕。它隐含了:
- 本地 DNS 解析(如果用域名连接)
- TCP 三次握手(首次连接或连接池失效时)
- MySQL 协议认证与 SSL 握手(若启用 SSL)
- SQL 请求序列化 + 网络发送
- 服务端执行(含锁等待、磁盘 IO、CPU 调度等)
- 结果集序列化 + 分块网络返回
- Navicat 接收并渲染结果(尤其大数据量时明显)
也就是说,Query took 2.345 sec ≠ 服务端执行了 2.345 秒 —— 如果你怀疑是网络问题,不能只看这个数字。
如何定位是不是网络等待拖慢了查询
最直接的办法是绕过 Navicat,在数据库服务器本机或同机房终端执行相同 SQL,对比耗时:
- 在 MySQL 服务端执行:
mysql -h 127.0.0.1 -u user -p -e "SELECT ...",观察Query OK, X rows affected (Y sec) - 在 PostgreSQL 服务端执行:
psql -c "EXPLAIN (ANALYZE, BUFFERS) SELECT ...",注意输出末尾的Execution Time: - 如果服务端本地执行只要 0.02 秒,而 Navicat 显示 1.8 秒,大概率是网络或客户端开销(比如结果集太大导致渲染卡顿)
此时再用系统工具确认网络质量:ping -c 5 your-db-host 看延迟是否稳定;mtr your-db-host 查路由跳点是否有丢包或高延迟节点。
Navicat 性能剖析器(Profiler)不显示 Wait 时间
Navicat 的“性能剖析器”功能(MySQL 对应 SET profiling = 1,PostgreSQL 对应 \timing 或 pg_stat_statements)只反映**服务端内部各阶段耗时**,例如:
- MySQL 的
SHOW PROFILES中的Duration是服务端执行时间,不含网络 - PostgreSQL 的
EXPLAIN (ANALYZE)中的Execution Time:同样不含客户端往返 - 这些数据在 Navicat 中展示时,仍会被包裹进一个更大的
Query took总时间里,无法反推网络占比
真正想监控网络层 Wait,得用操作系统级工具:tcpdump 抓包看 SYN/ACK 间隔、Wireshark 分析 MySQL 协议帧时间戳、或数据库驱动层日志(如 JDBC 的 connectTimeout / socketTimeout 参数影响)。
容易被忽略的关键点
很多人以为调大 Navicat 的“保持连接间隔”能减少网络等待,其实它只防连接断开重连,对单次查询的网络延迟毫无影响。真正影响单次查询网络耗时的是物理距离、带宽、防火墙策略、TLS 版本协商开销——这些 Navicat 完全不可见,也不该由它来诊断。



















