Navicat如何使用EXPLAIN分析SQL执行计划

云枫同学_3674

云枫同学_3674

2026-08-29

612人浏览

原创

点了“解释”按钮没反应,大概率是sql语句不完整或非select/update/delete类型、用户权限不足(如mysql缺process权限)、语句含多余分号或中间注释导致解析失败。

点了“解释”按钮没反应,大概率是这三件事没做对

navicat 的“解释”功能不是万能开关,它依赖语句合法性、权限和数据库能力。点下去没结果,别急着怀疑工具,先检查这几点:

  • SQL 必须是完整可解析的 SELECT、UPDATE 或 DELETE —— INSERT、SET、存储过程调用、带未绑定参数的 WHERE id = ? 都不支持
  • MySQL 用户需有 PROCESS 权限;PostgreSQL 用户需能访问 pg_stat_statements(某些版本);Oracle 需对 PLAN_TABLE 有写权限
  • 语句末尾多了一个分号 ;,或注释嵌在中间(如 SELECT /* hint */ id FROM t),部分 Navicat 版本(尤其 v15.x)会直接丢弃整条语句

MySQL 里 type=ALL 和 key=NULL 真正意味着什么

这两项不是警告,是确诊书:它告诉你查询根本没走索引,正在全表扫描。

  • type=ALL 表示优化器决定逐行读取整张表——哪怕只有 5000 行,也可能因随机 I/O 拖慢响应
  • key=NULL 说明哪怕表上有索引,优化器也没选它。常见诱因:WHERE YEAR(create_time) = 2023(函数导致索引失效)、user_id = 123(字段是字符串,传了数字引发隐式转换)
  • 别只盯着 type 判断快慢:右键执行计划表格 → “显示所有列”,重点看 rows 值——它才是预估扫描行数,type=ALL 但 rows=100 可能比 type=range 却 rows=50000 更优

想看真实耗时和 I/O,必须绕开 Navicat 默认行为

Navicat 工具栏那个“解释”图标只发 EXPLAIN,不触发实际执行。你看到的只是估算,不是真相。

navicatmysql
navicatmysql

Navicat For MySQL

下载
  • MySQL:别点按钮,直接在编辑器里写 EXPLAIN FORMAT=JSON SELECT ...,按 F5 运行——JSON 结果里有 execution_time 和 rows_examined_per_scan
  • PostgreSQL:必须手写 EXPLAIN (ANALYZE, BUFFERS, TIMING) SELECT ...,否则 Buffers: 和 Execution Time: 行根本不会出现
  • 注意陷阱:查询窗口右下角状态栏显示的“耗时”是网络传输 + 解析时间,不是数据库真实执行耗时

为什么加了索引,EXPLAIN 还显示 type=range 而不是 ref

这不是 bug,是优化器在权衡。range 不等于差,ref 也不等于好——关键看 rows 和 filtered。

  • type=range 常见于 IN、BETWEEN、> 等范围条件,即使用了索引,也得扫描索引片段
  • 如果索引是复合索引 (a,b,c),而查询只用 WHERE a = ? AND b > ?,优化器可能选 range 而非 ref,因为后缀字段无法精确匹配
  • 真正要盯的是 filtered 列:它表示该步骤过滤后剩余行数占比。若 filtered=10.00,说明 90% 的扫描结果被丢弃了——这时才该考虑调整索引顺序或拆分条件

执行计划不是一锤定音的判决书,而是优化器在当前统计信息下的最优猜测。最常被忽略的,是没验证 rows 是否接近真实值,以及没对比 ANALYZE 前后的缓冲命中率变化。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

4183

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

891

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

1089

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

6081

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

2943

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

6040

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

8121

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1110

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

972

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.4万人学习