php应用数据库慢日志分析核心是启用mysql慢查询日志并用mysqldumpslow或pt-query-digest解析,结合php上下文定位问题源头。

PHP 应用数据库慢日志分析,核心不在于 PHP 本身记录慢查询,而在于**让数据库(通常是 MySQL)生成可分析的慢查询日志(Slow Query Log),再用专业工具解析**。PHP 层一般只负责触发 SQL,真正的执行耗时、锁等待、扫描行数等关键指标由数据库引擎统计并写入日志。
开启 MySQL 慢查询日志
确保 MySQL 已启用慢日志,并合理设置阈值(如超过 1 秒记为慢查询):
- 登录 MySQL 执行:SET GLOBAL slow_query_log = 'ON';
- 设置慢查询阈值(单位:秒):SET GLOBAL long_query_time = 1.0;
- 指定日志文件路径:SET GLOBAL slow_query_log_file = '/var/log/mysql/mysql-slow.log';
- 建议同时开启:SET GLOBAL log_queries_not_using_indexes = ON;(记录未走索引的查询,辅助优化)
- 以上配置需写入 my.cnf 的 [mysqld] 段落,避免重启失效
使用 mysqldumpslow 快速定位高频/高耗时 SQL
MySQL 自带轻量工具,适合初步筛查:
基于Intranet/Internet 的Web下的办公自动化系统,采用了当今最先进的PHP技术,是综合大量用户的需求,经过充分的用户论证的基础上开发出来的,独特的即时信息、短信、电子邮件系统、完善的工作流、数据库安全备份等功能使得信息在企业内部传递效率极大提高,信息传递过程中耗费降到最低。办公人员得以从繁杂的日常办公事务处理中解放出来,参与更多的富于思考性和创造性的工作。系统力求突出体系结构简明
- 查看最慢的 10 条语句:mysqldumpslow -s t -t 10 /var/log/mysql/mysql-slow.log
- 查看访问次数最多的 10 条:mysqldumpslow -s c -t 10 /var/log/mysql/mysql-slow.log
- 按查询时间 + 锁等待时间排序:mysqldumpslow -s tl -t 10 /var/log/mysql/mysql-slow.log
- 注意:它会自动归一化 SQL(如把 WHERE id=123 变成 WHERE id=N),便于聚合统计
用 pt-query-digest 深度分析(推荐)
Percona Toolkit 中的 pt-query-digest 是业界标准工具,支持聚合、报告、瓶颈识别和建议:
立即学习“PHP免费学习笔记(深入)”;
- 安装(以 Ubuntu 为例):apt install percona-toolkit
- 生成详细 HTML 报告:pt-query-digest --report-format html /var/log/mysql/mysql-slow.log > slow-report.html
- 关键输出包括:总执行时间占比、平均响应时间、95% 延迟、全表扫描次数、锁等待时间、典型 SQL 示例及 EXPLAIN 建议
- 可直接关联 MySQL 实例自动执行 EXPLAIN:pt-query-digest --explain h=localhost,u=root,p=xxx /var/log/mysql/mysql-slow.log
结合 PHP 应用上下文定位问题源头
仅看 SQL 不够,需回溯到 PHP 代码层:
- 在慢 SQL 的日志中查找 # User@Host 行,确认是哪个应用连接(如 php_app@10.0.1.5)
- 开启 MySQL 的 general_log(临时)配合时间戳,交叉比对 PHP 请求日志(如 Nginx access.log 或 Laravel 日志中的 request_id)
- 在 PHP 中统一封装数据库操作,记录 SQL + 执行时间 + 调用栈(可用 debug_backtrace() 截取前几层),写入结构化日志(如 JSON),便于 ELK 或 Grafana 关联分析
- 对 ORM 场景(如 Laravel Eloquent),注意 N+1 查询、未预加载、重复 save() 等常见模式,pt-query-digest 报告中若出现大量相似小查询,大概率是这类问题










