Navicat 不记录慢查询日志,需确认 MySQL 的 slow_query_log 是否开启;检查 long_query_time 和 slow_query_log_file 配置;日志可能写入文件或 mysql.slow_log 表;应优先使用 EXPLAIN 实时分析执行计划,注意索引使用、类型匹配与统计信息更新。
Navicat 里根本看不到慢查询日志?先确认 MySQL 是否开了日志
navicat 本身不采集、不存储慢查询,它只是个客户端——真正记录慢查询的是 mysql 服务端。如果在 navicat 的「查询」窗口执行一条明显卡顿的 sql 却找不到对应日志,大概率是 slow_query_log 根本没开。
实操建议:
- 连上数据库后,先运行
SHOW VARIABLES LIKE 'slow_query_log';,确认值为ON - 检查
long_query_time(默认 10 秒),开发阶段建议设成0.1:SET GLOBAL long_query_time = 0.1; - 日志路径由
slow_query_log_file决定,常见位置如/var/lib/mysql/localhost-slow.log,但 Navicat 不直接读这个文件 - Windows 下 MySQL 8.0+ 默认关闭日志,且
log_output可能设为TABLE(写入mysql.slow_log表),这时得用SELECT * FROM mysql.slow_log ORDER BY start_time DESC LIMIT 10;查
在 Navicat 中快速定位某次执行慢的 SQL:别等日志,用「执行计划」当场看
等慢查询日志落盘再分析,节奏太慢。Navicat 自带的「解释执行计划」功能(EXPLAIN)才是实时诊断核心。
实操建议:
- 写完 SQL 后,别急着点「运行」,先点工具栏的
Explain按钮(或按Ctrl+E) - 重点关注
type列:出现ALL或index说明全表/全索引扫描,基本就是性能瓶颈 -
key列为空?代表没走索引;rows值远大于实际结果行数?说明索引选择性差或统计信息过期 - 如果
Extra出现Using filesort或Using temporary,ORDER BY / GROUP BY 很可能没利用好索引
Navicat 导出的慢查询 SQL 总是缺格式、带客户端元数据?清理再分析
从 Navicat 的「查询历史」或「结果集右键 → 复制为 SQL」导出的语句,常混入 /* ApplicationName=Navicat */ 注释、自动加的 LIMIT、甚至分页偏移逻辑,直接丢进 EXPLAIN 会误导判断。
实操建议:
- 复制前,在查询编辑器中手动删掉所有注释、
LIMIT、OFFSET—— 慢查询问题往往出在无限制的原始逻辑上 - 避免用「导出查询结果」功能反推 SQL,它生成的是 SELECT 结果快照,不是原始语句
- 若从
mysql.slow_log表查到语句,注意sql_text字段末尾可能有换行和空格,粘贴前用编辑器 Trim 空白符 - 对含变量的 SQL(如
WHERE user_id = ?),需替换成真实值再 EXPLAIN,否则优化器无法准确估算
为什么在 Navicat 里加了索引,EXPLAIN 还显示没走?检查这几个隐性条件
建完索引立刻去 Navicat 点 Explain,发现 key 仍是 NULL,不是索引失效,而是几个关键状态没同步。
实操建议:
- 执行
ANALYZE TABLE table_name;—— MySQL 需要更新统计信息才能重新评估索引价值 - 确认查询条件中的列类型和索引列严格一致:比如索引在
user_id(BIGINT),但 WHERE 里写了user_id = '123'(字符串),会触发隐式转换,索引失效 - Navicat 默认使用 prepared statement 协议,某些旧版本驱动在预编译模式下可能缓存执行计划,断开重连或执行
FLUSH PLUGINS;强制刷新(慎用) - 复合索引顺序是否匹配查询条件?
INDEX(a,b,c)能用于WHERE a=1 AND b=2,但对WHERE b=2无效
慢查询分析真正的复杂点不在 Navicat 界面操作,而在于你得同时盯着服务端配置、客户端协议行为、SQL 语义细节三块地方。少盯任何一块,都可能把 Using index condition 误判成全表扫。










