navicat 不能自动检测慢查询,其所有相关功能均依赖 mysql 已开启的慢查询日志且仅支持人工查看;真正自动检测需借助外部脚本轮询解析 mysql 慢日志并告警。
navicat 不能自动检测慢查询——它没有日志采集、阈值判断和告警能力,所有“自动检测”相关功能都依赖 mysql 服务端已开启的慢查询日志,且仅限人工查看或辅助分析。
Navicat 的「计划任务」根本不是监控工具
很多人误以为在 Navicat 里建个定时执行的 SQL 脚本(比如 SELECT * FROM mysql.slow_log ORDER BY query_time DESC LIMIT 10),就算实现了“自动检测”。事实是:
- 该任务只在你本地电脑开机、登录、Navicat 启动且后台常驻时才可能触发;服务器宕机、网络断开、客户端休眠都会导致失效
- 它不解析日志内容,不比对
long_query_time,不提取耗时、锁时间、扫描行数等关键字段做聚合统计 - 即使
mysql.slow_log表已开启,它默认无索引,ORDER BY query_time DESC在日志量稍大(>1万行)时会卡住 Navicat,甚至拖垮整个连接 - 不支持发送钉钉/企业微信/邮件等任何告警动作,纯属本地 SQL 执行器
真正能“自动”的路径:MySQL 日志 + 外部脚本
生产环境唯一可靠的做法是绕过 Navicat,让 MySQL 自己记日志,再用轻量脚本轮询解析。Navicat 只在后续环节起作用:
- 确认 MySQL 已启用文件日志:
SET GLOBAL slow_query_log = ON;,并设阈值:SET GLOBAL long_query_time = 1.0; - 检查日志路径:
SHOW VARIABLES LIKE 'slow_query_log_file';,确保mysqld进程用户(如mysql)写的文件,外部脚本能读(chmod 644或调整logrotate权限) - 用 Python 或 Shell 每分钟执行:
tail -n 500 /var/log/mysql/mysql-slow.log | grep -A 2 "Query_time:" | awk '/Query_time:/ {time=$2; getline; sql=$0; if (time > 2.0) print time, sql}' - 命中后调用
curl推送至钉钉 Webhook,或写入告警队列;此时才打开 Navicat,粘贴告警里的 SQL,用EXPLAIN FORMAT=JSON查执行计划
Navicat Monitor 是唯一接近“自动”的官方方案
如果你有 Navicat Monitor 许可证(非免费版 Navicat Premium),它确实能持续采集、聚合、可视化慢查询,但要注意:
- 它不替代 MySQL 慢日志,而是通过定期执行
SELECT * FROM performance_schema.events_statements_summary_by_digest等性能表来估算“慢”——这意味着它依赖performance_schema开启且配置合理(events_statements_history_long需启用) - 它的“费时查询”页面展示的是近似耗时,不是原始慢日志里的
Query_time,两者可能差 10%~30%,尤其涉及锁等待时 - 告警规则基于指标(如平均响应时间 > 2s 持续 5 分钟),不是单条 SQL 的
query_time值,无法精准定位某次超时 - 必须部署独立的 Monitor Server,且要开放数据库账号的
PROCESS和SELECT权限,权限管控比纯日志方案更重
最常被忽略的点:慢查询日志本身是否真在记录。90% 的“查不到慢 SQL”问题,根源是 slow_query_log 为 OFF,或者 long_query_time 设得太高(比如默认 10 秒),而业务里真正卡顿的 SQL 其实只慢了 1.2 秒。别急着配工具,先连上 MySQL 执行 SHOW VARIABLES LIKE 'slow_query_log' 和 SHOW VARIABLES LIKE 'long_query_time' 确认基础开关状态。











