如何监控MySQL数据库请求?及排查PHP应用高数据库访问量页面方法
针对你的MySQL监控与优化问题的实用方案
嘿,结合你使用的PHP 7.2.4版本,我来逐一解答你的两个问题:
1. 如何监控MySQL数据库请求?
你可以从MySQL原生工具和PHP应用层两个维度入手,按需选择合适的方法:
- MySQL内置监控工具
- 通用查询日志:能记录所有到达MySQL的请求,适合临时排查问题。临时开启可以执行:
SET GLOBAL general_log = 'ON';(重启MySQL后会失效);如果要永久开启,需要在my.cnf里配置general_log = 1和general_log_file = /path/to/log/file,但注意这个日志会快速膨胀,建议只在排查阶段短时间启用。 - 慢查询日志:更适合聚焦耗时久的请求,不会产生过多日志。开启命令:
SET GLOBAL slow_query_log = 'ON';,同时可以设置阈值(比如记录超过2秒的查询):SET GLOBAL long_query_time = 2;,日志里会包含SQL语句、执行时间、发起请求的客户端信息等,是优化的核心依据。 - Performance Schema:这是MySQL自带的轻量性能监控框架,不需要额外安装。你可以查询
performance_schema.events_statements_summary_by_digest这类表,获取请求的统计数据(比如执行次数、平均耗时),能快速定位高频或低效的查询。
- 通用查询日志:能记录所有到达MySQL的请求,适合临时排查问题。临时开启可以执行:
- PHP应用层日志
因为你用的是PHP 7.2.4,建议在数据库操作的封装层(比如PDO/MySQLi的封装类)里添加自定义日志,把SQL语句、执行时间、调用的页面文件/行号都记录下来,直接关联到代码层面。举个PDO的示例:// 在你的数据库操作函数里添加日志逻辑 function executeQuery($pdo, $sql, $params = []) { $startTime = microtime(true); $stmt = $pdo->prepare($sql); $stmt->execute($params); $execTime = round(microtime(true) - $startTime, 3); // 获取调用当前函数的文件和行号 $caller = debug_backtrace()[1]; $callerInfo = "{$caller['file']}:{$caller['line']}"; // 写入日志(可以指定自定义日志文件路径) error_log(sprintf( "[DB_LOG] Time: %ss | SQL: %s | Params: %s | Page: %s", $execTime, $sql, json_encode($params), $callerInfo ), 3, '/var/log/php_db_queries.log'); return $stmt; }
2. 如何定位数据库访问量最大的页面?
结合PHP环境,这几个方法能帮你快速找到目标页面:
- 分析自定义PHP数据库日志
刚才提到的自定义日志里已经记录了每个查询对应的调用页面,用简单的Shell命令就能统计:
执行后会得到类似# 统计每个页面的数据库请求次数,按从高到低排序 grep "\[DB_LOG\]" /var/log/php_db_queries.log | awk -F'Page: ' '{print $2}' | sort | uniq -c | sort -nr120 /var/www/html/index.php的结果,数字就是该页面发起的数据库请求次数。 - 请求ID关联法
给每个HTTP请求生成唯一ID,在执行SQL时把ID作为注释嵌入,之后结合MySQL日志和Web服务器日志(比如Nginx的access.log)关联分析。示例PHP代码:
之后在MySQL的慢查询日志或Performance Schema里找到带这个ID的SQL,再去Web日志里搜对应的请求ID,就能定位到访问的页面路径。// 生成唯一请求ID $requestId = uniqid('req_', true); // 把请求ID加入SQL注释 $sql = "/* RequestID: {$requestId} */ SELECT * FROM products WHERE category_id = ?"; - 补充优化建议
既然MySQL是CPU占用大户,找到高频页面后,你可以考虑:给高频查询的结果加缓存(比如用Redis缓存页面片段或数据)、优化高频SQL的索引、拆分复杂查询,这些都能有效降低数据库的CPU负载。
内容的提问来源于stack exchange,提问作者user6715903
相关产品推荐
相关产品推荐

