ThinkPHP 8.0 无原生慢查询开关,需MySQL开启slow_query_log并配置long_query_time,再配合ThinkPHP开启trigger_sql、log_sql、log_bind及sql_explain,双层协同定位慢SQL上下文与执行瓶颈。

ThinkPHP 8.0 本身不直接提供“慢查询日志”开关,它不拦截或判断 SQL 执行耗时;真正的慢查询日志必须由 MySQL 原生开启,并配合 ThinkPHP 的 SQL 日志能力,才能把「哪条慢 SQL 在哪个请求中执行」关联起来。
要有效配置并用好数据库慢查询日志,需分两层:MySQL 层记录慢 SQL + ThinkPHP 层注入上下文。缺一不可。
开启 MySQL 慢查询日志(服务端)
这是基础,不依赖 PHP 框架:
- 登录 MySQL,执行:
SET GLOBAL slow_query_log = 'ON'; SET GLOBAL long_query_time = 0.1; -- 记录超过 100ms 的查询(按需调整) SET GLOBAL log_output = 'TABLE'; -- 或 'FILE',推荐先用 TABLE 方便查:SELECT * FROM mysql.slow_log LIMIT 5;
- 永久生效需修改 MySQL 配置文件(如
/etc/my.cnf):[mysqld] slow_query_log = ON long_query_time = 0.1 log_output = FILE slow_query_log_file = /var/log/mysql/slow.log
✅ 验证是否生效:执行一条明显慢的查询(如
SELECT SLEEP(0.2)),再查SELECT * FROM mysql.slow_log(若log_output=TABLE)或查看对应日志文件。
PHP 8.5.12下载修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
立即学习“PHP免费学习笔记(深入)”;
启用 ThinkPHP 的 SQL 日志并绑定上下文(应用层)
MySQL 慢日志只记 SQL 和耗时,但不知道是哪个用户、哪个接口、哪个事务触发的。你需要 ThinkPHP 把请求 ID、控制器、参数等打进去:
- 确保
.env中开启调试:APP_DEBUG=true
- 清空
runtime/目录(尤其runtime/log/),避免旧缓存干扰; - 修改
config/database.php,确保关键配置启用:'trigger_sql' => true, // 必须开,否则不记录任何 SQL 'log_sql' => true, // 记录 SQL 到 ThinkPHP 日志 'log_bind' => true, // 记录绑定参数(看清 ? 对应的真实值) 'sql_explain' => true, // 对每条 SELECT 自动加 EXPLAIN,辅助判断索引
- 在
config/log.php中,让日志包含sql级别:'level' => ['error', 'sql', 'notice'],
✅ 验证方式:调用
User::where('id', 1)->find()后,打开runtime/log/sql/下最新日志文件,应看到类似:[2026-10-29 14:20:03] sql.INFO: SELECT * FROM `user` WHERE `id` = ? [1] {"sql":"SELECT * FROM `user` WHERE `id` = ?","time":0.012,"explain":{...}}
关键提醒:不要只看“慢”,要看“为什么慢”
-
long_query_time = 0.1不代表所有 >100ms 的查询都该优化——可能是网络延迟、大字段传输、或临时表排序导致; - 更重要的是结合
EXPLAIN看执行计划:type=ALL、rows过万、Extra出现Using filesort或Using temporary,才是真瓶颈; - ThinkPHP 的
with()、whereIn()、order()+group()等链式写法极易隐式生成低效 SQL,务必用日志+EXPLAIN 双验证。
不复杂但容易忽略



















