navicat 不支持多语句并行 explain,仅对选中或光标所在单条语句执行;需手动分步解释、固定标签页对比,并确保同一连接、同一时刻执行以保障 cost 可比性。

Navicat 本身不支持多语句并行 Explain
点击一次「解释」按钮,Navicat 只会处理当前编辑器中**选中的或光标所在的单条语句**(即使你粘贴了多条 SELECT),不会自动拆分、逐条发送 EXPLAIN。所谓“同时对多个 SQL 执行 Explain”,本质是手动触发多次、再人工比对——工具不提供批量解析或横向表格视图。
手动实现多语句 Explain 的可行路径
想横向对比几条相似查询的成本(比如加索引前后、不同 JOIN 写法),必须分步操作,并控制变量:
- 确保每条语句都独立成行、无分号结尾(尤其 PostgreSQL);MySQL 用户注意避免
/* */注释,否则EXPLAIN可能解析失败 - 在同一个查询窗口里,用
--分隔不同语句,每次只选中其中一条 → 右键 →「解释」 - 每次解释后,右键该结果标签页 →「固定」,防止切换时被覆盖;重复此动作,为每条语句保留一个独立的「解释」标签页
- Windows 下用
Win + ←/Win + →将多个 Navicat 窗口并列铺开;macOS 可用 Mission Control 拖拽对齐
成本(Cost)值横向比较的关键前提
Cost 是数据库优化器内部估算的相对值,跨语句比较只有在同一上下文下才有意义:
- 必须在**同一连接、同一时刻**执行,避免统计信息(
ANALYZE TABLE)或配置(如optimizer_switch)中途变动 - MySQL 8.0+ 的
cost_info在EXPLAIN FORMAT=JSON中才完整,Navicat 默认展示的是汇总cost列,看不到read_cost和eval_cost拆分——需手动改写为EXPLAIN FORMAT=JSON SELECT ...并点「运行」,再从 JSON 结果里提取 - PostgreSQL 的
EXPLAIN (ANALYZE)返回的是真实耗时,不是 cost;它没有 MySQL 那套归一化成本模型,直接比Execution Time更实际
真正容易被忽略的陷阱
很多人以为把三条语句并排打开就能“一眼看出哪个 cost 低”,但实际常栽在这几个点上:
- 没确认是否用了相同的数据集:某条语句查的是空表、另一条查的是百万行,
rows和cost完全不可比 - Oracle/SQL Server 用户误把图形化执行计划里的“Estimated Subtree Cost”当 MySQL 的
cost——两者算法和量纲不同,不能跨引擎比 - 固定标签页后忘了刷新:如果中间执行过
ANALYZE TABLE或修改了索引,旧的「解释」结果仍是缓存值,不会自动更新











