mysql慢查询日志需手动配置my.ini并重启服务:设slow_query_log=on、long_query_time=0.5(小数)、slow_query_log_file加双引号路径;动态set global易失效,务必验证日志文件是否真实生成。

phpEnv 是 Windows 下的集成环境,它默认不开启 MySQL 慢查询日志,long_query_time 也维持默认的 10 秒——这在调试 PHP 应用时基本无效。必须手动修改配置并重启 MySQL 服务才能生效。
确认当前慢查询是否启用及阈值
别猜配置文件有没有写对,直接连进 MySQL 查真实状态:
- 执行
SELECT @@slow_query_log;—— 返回1才算真开了,0就是关着 - 执行
SHOW VARIABLES LIKE 'long_query_time';—— 注意看 Value 是不是10.000000(默认值) - 执行
SHOW VARIABLES LIKE 'slow_query_log_file';—— 确认路径是否存在、MySQL 进程是否有写权限(比如 phpEnv 默认可能指向C:/phpenv/phpenv/server/mysql/data/xxx-slow.log)
修改 my.ini 并重启 MySQL 服务
phpEnv 的 MySQL 配置文件是 my.ini,位置通常在:C:/phpenv/phpenv/server/mysql/my.ini(具体路径以你安装时为准)。在 [mysqld] 段落下添加或修改这几行:
slow_query_log = ON long_query_time = 0.5 slow_query_log_file = "C:/phpenv/phpenv/server/mysql/data/mysql-slow.log"
注意点:
-
long_query_time必须写成小数,比如0.5,写成1或0会被当整型忽略(MySQL 5.7+ 行为) - 路径用双引号包裹,避免 Windows 路径空格或反斜杠引发解析错误
- 改完必须重启 phpEnv 的 MySQL 服务(不是重启整个 phpEnv),否则配置不加载
为什么 SET GLOBAL 不推荐用于 phpEnv?
虽然可以运行 SET GLOBAL slow_query_log = 'ON'; 临时开启,但在 phpEnv 场景下容易踩坑:
- phpEnv 的 MySQL 服务常被设为“自动延迟启动”,手动执行
SET GLOBAL后若服务意外重启,设置就丢了 -
long_query_time动态修改后,已有连接仍沿用旧值,而 phpEnv 下 PHP-FPM 连接池复用频繁,你看到的“没生效”很可能只是连接没刷新 - Windows 下文件权限更敏感,
SET GLOBAL slow_query_log_file指定路径若没写对,MySQL 可能静默失败,日志根本不会生成
验证日志是否真在记录
改完配置、重启服务后,别急着跑业务,先人工触发一条慢 SQL 测试:
- 执行
SELECT SLEEP(1);(确保超过你设的long_query_time) - 等几秒,去查看
slow_query_log_file指向的文件,应该有类似这样的内容:
# Time: 2026-04-19T04:45:22.123456Z # User@Host: root[root] @ localhost [] Id: 3 # Query_time: 1.000234 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 1 use test; SELECT SLEEP(1);
如果文件为空,优先检查 MySQL 错误日志(通常是 data/xxx.err),常见原因是路径不可写或 SELinux/AppArmor 类机制在 Windows 上表现为权限拦截(比如杀毒软件锁定目录)。
最易被忽略的一点:phpEnv 的 MySQL 默认关闭了 log_queries_not_using_indexes,但如果你正在排查“明明有索引却还慢”的问题,需要额外打开它——不过要小心,它会让日志量暴增,只建议临时开启、定位完立刻关掉。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











