navicat 17 不支持导出完整 sql profiling 数据,因其 profile 页签仅调用 show profiles 和 show profile for query n(缺 io 修饰符),无法获取 io read bytes、fsyncs 等关键 i/o 指标;必须在查询窗口中手动执行 show profile io, cpu, block io for query n 才能获得完整分析。

Navicat 17 本身不支持导出完整的 SQL Profiling 分析诊断数据——它只显示 SHOW PROFILE 的简化视图,且无法导出 IO read bytes、IO fsyncs 等关键 I/O 指标。真要拿到完整 profiling 数据,必须绕过 Navicat 的图形界面,直接在查询窗口中执行原生命令并手动整理。
为什么 Navicat 的 Profile 页签导不出 IO 数据
Navicat 的 Profile 页签底层调用的是 SHOW PROFILES 和 SHOW PROFILE FOR QUERY N,但默认不带 IO 修饰符;它只展示 wall-clock 时间(如 sending data 耗时),而不会返回磁盘读写字节数或 fsync 次数。即使你看到某阶段耗时 1.2s,也无法判断这是 CPU 计算慢、锁等待长,还是真实发生了 50MB 磁盘读取。
-
SHOW PROFILE IO FOR QUERY N才是获取 I/O 指标的唯一有效命令,Navicat 不提供该结果的导出按钮 - Profile 页签灰显或提示 “unable to show performance schema”,大概率是服务端
performance_schema = OFF或当前用户缺少SELECT ON performance_schema.*权限 - MySQL 8.0+ 已彻底弃用
SET profiling = 1,依赖它会得到空结果
在 Navicat 查询窗口中获取完整 profiling 数据的最小操作流
必须在同一连接内顺序执行以下三步,否则 QUERY N 编号会错乱:
- 先运行目标 SQL:
SELECT * FROM orders WHERE status = 'shipped' AND created_at > '2025-08-01'; - 立即执行:
SHOW PROFILES;—— 查看最近查询的 ID(比如是Query_ID = 3) - 再执行:
SHOW PROFILE IO, CPU, BLOCK IO FOR QUERY 3;——IO和BLOCK IO必须显式指定才能看到磁盘行为
输出中重点关注三列:Status(阶段名)、Duration(耗时)、IO read bytes(该阶段读取的磁盘字节数)。若某阶段 IO read bytes 达到几 MB 以上,而 Duration 却很短,说明 buffer pool 命中率高;若两者都大,才是真实 I/O 瓶颈。
如何把 profiling 结果“导出”为可用格式
Navicat 不提供一键导出按钮,但你可以用最简方式保存成结构化文本:
- 在查询结果网格中右键 → 复制所选内容(不是“复制所有”),粘贴到 Excel 或 Markdown 表格里
- 若需长期归档,建议在查询窗口中拼接成 INSERT 语句存入临时表:
CREATE TEMPORARY TABLE profile_dump AS SELECT * FROM performance_schema.events_statements_history_long WHERE EVENT_NAME LIKE 'statement/sql/select%'; - 注意:不要依赖
SELECT * FROM information_schema.PROFILING—— 这张表在 MySQL 8.0+ 中已被移除
真正需要定位 I/O 来源时,SHOW PROFILE IO 只能告诉你“哪个阶段读得多”,但不能说清“从哪张表读的”。这时必须补一句:EXPLAIN FORMAT=JSON,看输出里的 table_name 和 rows_examined,再结合引擎页大小(如 InnoDB 默认 16KB)估算逻辑读页数。











