MySQL架构揭秘:慢查询日志详解
在数据库运维和性能调优工作中慢查询日志Slow Query Log是我们最常用的诊断工具之一。它能够帮助我们快速定位那些执行效率低下的SQL语句为后续优化提供精准的切入点。本文将带你从零开始全面了解MySQL慢查询日志的配置、使用及分析方法。 什么是慢查询日志慢查询日志是MySQL提供的一种记录机制用于记录所有执行时间超过预设阈值long_query_time的SQL语句以及未使用索引的查询语句。它就像数据库的“体检报告”能直观展示哪些查询拖慢了系统性能。默认情况下慢查询日志功能是关闭的需要手动开启。日志可以存储在文件FILE或数据库的专用表TABLE中方便后续分析。⚙️ 慢查询相关参数详解在开启慢查询前我们先了解几个核心参数参数名说明slow_query_log是否开启慢查询日志值为ON/OFFslow_query_log_file慢查询日志的存储路径及文件名默认与数据文件同目录long_query_time慢查询阈值单位秒默认10秒。超过此时间的SQL会被记录log_queries_not_using_indexes是否记录未使用索引的查询建议开启log_output日志输出方式可选FILE、TABLE或FILE,TABLE查看当前参数设置-- 查看慢查询相关配置 SHOW VARIABLES LIKE %slow_query_log%; -- 查看超时阈值 SHOW VARIABLES LIKE %long_query_time%; 如何开启慢查询日志1. 临时开启会话级或全局级-- 开启慢查询日志全局生效重启后失效 SET GLOBAL slow_query_log ON; -- 设置超时阈值为1秒注意需要重新连接会话才能看到变化 SET GLOBAL long_query_time 1;⚠️注意long_query_time修改后当前会话不会立即生效需要新建立的连接才会使用新阈值。2. 永久生效配置文件在my.cnf或my.iniWindows中添加以下配置[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_output FILE,TABLE保存并重启MySQL服务即可。 实操演示产生并查看慢查询日志Step 1开启慢查询并设置阈值SET GLOBAL slow_query_log ON; SET GLOBAL long_query_time 1;Step 2执行一条较慢的查询-- 假设表 t_user 有约500万条数据且 address 字段未索引 SELECT * FROM t_user WHERE address 上海22;Step 3查看日志内容日志默认记录在slow_query_log_file指定的文件中内容示例如下# UserHost: root[root] localhost [127.0.0.1] Id: 220 # Query_time: 1.552678 Lock_time: 0.003271 Rows_sent: 1 Rows_examined: 4999998 SET timestamp1597840221; SELECT * FROM t_user WHERE address 上海22; 慢查询日志内容解析慢查询日志中的每一段记录包含以下关键信息字段说明UserHost执行该SQL的用户名、客户端IP及连接IDQuery_time该查询执行的总耗时单位秒Lock_time等待表锁或行锁的时间Rows_sent最终返回给客户端的结果行数Rows_examined执行过程中扫描的数据行数核心优化指标SET timestampSQL执行的时间戳SQL语句实际执行的完整SQL 重点分析Query_time过长 → 需要优化SQL或索引Rows_examined远大于Rows_sent→ 说明扫描了大量无效数据是典型的索引缺失或SQL写法不佳的信号Lock_time过高 → 可能存在锁竞争需检查事务隔离级别或业务逻辑 慢查询日志的两种输出格式1. FILE 格式文本文件可读性好适合人工查看和分析也支持用mysqldumpslow工具进行汇总统计。# 按查询时间排序显示前10条 mysqldumpslow -s t -t 10 /path/to/slow.log2. TABLE 格式mysql.slow_log便于用SQL进行查询分析例如SELECT * FROM mysql.slow_log WHERE query_time 2 ORDER BY query_time DESC LIMIT 10; 建议同时启用FILE,TABLE兼顾可读性和查询便利性。 常见问题与注意事项开启慢查询日志对性能有影响吗有轻微影响但在生产环境中开启尤其配合合理的阈值通常可以接受。建议在业务低峰期开启测试再推广到生产。为什么我设置了long_query_time1还是记录了小于1秒的查询检查是否开启了log_queries_not_using_indexes该参数会让未使用索引的查询忽略时间阈值直接记录。日志文件过大怎么办可配置日志轮转如logrotate或定期清理备份。也可通过设置expire_logs_days自动清理历史日志。 总结与优化建议优化方向建议开启慢查询生产环境务必开启阈值建议从1~2秒开始记录未使用索引的SQL强烈建议开启这是发现潜在性能问题的重要途径定期分析日志使用mysqldumpslow或pt-query-digest等工具定期分析结合执行计划对慢SQL使用EXPLAIN分析执行计划针对性添加索引或重写SQL