MySQL慢查询日志分析工具,可视化分析SQL
MySQL慢查询日志是定位数据库性能问题的第一手资料。
如果你发现网站响应变慢、CPU飙升,却不知道是哪条SQL拖垮了数据库,那么学会使用慢查询日志分析工具,尤其是可视化分析SQL,就能快速找到问题语句。
本文从零开始,带你完成日志开启、工具安装、数据采集和可视化展示,最终能独立排查慢查询。
开启慢查询日志并确认记录
默认情况下MySQL慢查询日志是关闭的,需要手动开启。
你可以通过命令行临时开启,也可以修改配置文件永久生效。
临时开启(重启失效)
登录MySQL后执行:
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;
SET GLOBAL slow_query_log_file = '/var/log/mysql/slow.log';
long_query_time表示超过多少秒的查询会被记录,建议先设为1秒,后续根据业务调整。
永久生效
编辑MySQL配置文件(通常位于/etc/mysql/my.cnf或/etc/my.cnf),在[mysqld]段落下添加:
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 1
log_queries_not_using_indexes = 1
log_queries_not_using_indexes会记录未使用索引的查询,方便发现潜在问题,但可能产生大量日志,建议按需开启。
修改后重启MySQL:systemctl restart mysqld。
验证是否生效
执行SHOW VARIABLES LIKE 'slow_query_log';,返回ON即成功。
然后手动执行一条SELECT SLEEP(2);,再查看慢日志文件是否出现记录:tail -f /var/log/mysql/slow.log。
使用pt-query-digest做命令行分析
Percona Toolkit中的pt-query-digest是最常用的慢查询日志分析工具,能汇总相似SQL并按耗时排序。
安装Percona Toolkit
CentOS/RHEL:
yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
yum install percona-toolkit
Debian/Ubuntu:
wget https://repo.percona.com/apt/percona-release_latest.generic_all.deb
dpkg -i percona-release_latest.generic_all.deb
apt update
apt install percona-toolkit
分析日志并生成报告
pt-query-digest /var/log/mysql/slow.log > slow_report.txt
报告会列出总查询数、执行时间分布、最慢的SQL等。
重点关注Response time和Calls,前者表示总耗时占比,后者是执行次数。
输出到数据库表以便可视化
pt-query-digest --review h=localhost,D=slow_log,t=query_review --create-review-table /var/log/mysql/slow.log
这样结果会存入MySQL表,后续可用Web程序读取展示。
搭建可视化分析界面
命令行报告不够直观,可以用开源工具如Anemometer或pt-visual-explain配合Web界面。
这里以Anemometer为例,它专门用于展示pt-query-digest存入数据库的结果。
环境要求
- Web服务器(Nginx/Apache)
- PHP 7.x及以上
- MySQL数据库(存储分析结果)
部署步骤
- 下载Anemometer源码放入网站目录:
git clone https://github.com/box/Anemometer.git /var/www/anemometer
- 导入表结构:
mysql -uroot -p < /var/www/anemometer/install.sql
- 修改配置文件
conf/config.inc.php,填写数据库连接信息:
$conf['datasources']['localhost'] = array(
'host' => '127.0.0.1',
'port' => 3306,
'db' => 'slow_query_log',
'user' => 'root',
'password' => '你的密码',
);
- 配置Web服务器指向该目录,确保PHP可执行。
- 浏览器访问
http://你的服务器IP/anemometer,即可看到可视化界面,包括查询列表、执行时间趋势图、索引缺失提示等。
定期采集数据
添加定时任务,每小时分析一次慢日志并写入数据库:
0 * * * * pt-query-digest --review h=localhost,D=slow_query_log,t=query_review --create-review-table /var/log/mysql/slow.log
避坑与效果验证
常见坑点
- 日志文件路径权限:MySQL用户必须对日志目录有写权限,否则无法记录。
long_query_time设得太小会导致日志暴涨,建议先设1秒,观察后再调整。- pt-query-digest分析大文件时可能占用较多内存,可先用
--limit限制处理条数。 - 可视化工具需要PHP环境,注意版本兼容性,Anemometer对PHP 7.4+支持较好。
验证分析效果
完成上述步骤后,在可视化界面应能看到慢查询的统计图表。
如果图表为空,检查:
- 慢日志是否确实有记录
- pt-query-digest是否成功写入数据库
- 配置文件中的数据库连接是否正确
独立结论
判断慢查询优化优先级时,优先处理Response time占比高且Calls次数多的SQL。
如果日志中大量出现未使用索引的查询,考虑为相关字段添加索引。
可视化工具的价值在于持续监控,建议将慢查询日志分析纳入日常运维流程,每周回顾一次。
常见疑问
慢查询日志会影响性能吗?
开启日志本身有轻微开销,但远小于慢查询带来的影响。
生产环境建议开启,并设置合理的long_query_time。
pt-query-digest和MySQL自带mysqldumpslow有什么区别?
mysqldumpslow功能简单,只做基础聚合;
pt-query-digest支持更多维度分析(如按用户、按数据库),且能输出到数据库供可视化使用,更适合深度优化。
可视化工具必须用Anemometer吗?
不是,也可以使用Percona Monitoring and Management (PMM)或商业工具,但Anemometer轻量、开源,适合中小规模环境。
如何避免日志文件过大?
可以配置日志轮转,例如使用logrotate,或定期归档旧日志。
同时避免长期开启log_queries_not_using_indexes。
完成以上配置后,你就拥有了一套从采集到可视化的慢查询分析流程。
遇到性能问题不再盲目,而是有数据支撑地优化SQL。