MySQL的普通查询日志和慢查询日志都是数据库运行过程中的重要记录工具,但两者的定位、记录规则和使用场景存在明显差异,开发者需要根据实际需求选择是否开启以及如何使用。

普通查询日志的定义与特点
普通查询日志(General Query Log)是MySQL中记录所有客户端连接和执行的SQL语句的日志文件,只要客户端和数据库建立了连接,执行的所有操作都会被记录,包括查询、插入、更新、删除,甚至是连接和断开的操作。
普通查询日志的核心特点如下:
- 记录范围全:覆盖所有数据库操作,没有执行时长的限制
- 默认关闭:因为开启后会记录大量内容,对性能有一定影响,所以MySQL默认不开启该日志
- 适合全量排查:当需要排查某个时间段内数据库执行过的所有操作时,开启普通查询日志可以快速定位问题
慢查询日志的定义与特点
慢查询日志(Slow Query Log)是MySQL中专门记录执行时间超过指定阈值的SQL语句的日志,它的核心作用是帮助开发者找到执行效率低下的SQL,从而进行性能优化。
慢查询日志的核心特点如下:
- 记录有门槛:只有执行时间超过
long_query_time参数设置的阈值(默认是10秒)的SQL才会被记录 - 默认关闭:同样因为记录操作会带来一定性能开销,默认不开启
- 聚焦性能问题:记录的内容都是可能存在性能瓶颈的SQL,是数据库优化的核心参考依据
两者的核心区别对比
为了更清晰地展示两者的差异,我们可以从以下几个维度进行对比:
| 对比维度 | 普通查询日志 | 慢查询日志 |
|---|---|---|
| 记录范围 | 所有客户端执行的SQL及连接操作 | 仅执行时间超过阈值的SQL |
| 默认状态 | 关闭 | 关闭 |
| 性能影响 | 影响较大,因为记录内容多 | 影响较小,仅记录少量慢SQL |
| 核心用途 | 全量操作排查、审计 | SQL性能优化、慢查询定位 |
| 配置参数 | general_log、general_log_file | slow_query_log、slow_query_log_file、long_query_time |
两种日志的配置方式
普通查询日志配置
可以通过命令行临时开启普通查询日志,也可以通过配置文件永久开启。
临时开启(重启MySQL后失效):
-- 查看普通查询日志状态 SHOW VARIABLES LIKE 'general_log'; -- 开启普通查询日志 SET GLOBAL general_log = 'ON'; -- 设置普通查询日志文件路径 SET GLOBAL general_log_file = '/var/lib/mysql/general.log';
永久开启需要修改MySQL配置文件my.cnf(或my.ini),添加如下内容后重启MySQL:
[mysqld] # 开启普通查询日志 general_log = 1 # 设置日志文件路径 general_log_file = /var/lib/mysql/general.log
慢查询日志配置
同样支持临时和永久两种配置方式。
临时开启:
-- 查看慢查询日志状态 SHOW VARIABLES LIKE 'slow_query_log'; -- 开启慢查询日志 SET GLOBAL slow_query_log = 'ON'; -- 设置慢查询阈值,单位为秒,这里设置为2秒 SET GLOBAL long_query_time = 2; -- 设置慢查询日志文件路径 SET GLOBAL slow_query_log_file = '/var/lib/mysql/slow.log';
永久开启修改配置文件:
[mysqld] # 开启慢查询日志 slow_query_log = 1 # 慢查询阈值,单位秒 long_query_time = 2 # 慢查询日志文件路径 slow_query_log_file = /var/lib/mysql/slow.log
使用建议
普通查询日志因为会记录所有操作,对性能影响较大,不建议长期开启,仅在需要排查全量操作问题时临时开启,排查完成后及时关闭。
慢查询日志对性能影响较小,如果业务对数据库性能要求较高,可以长期开启,定期分析慢查询日志中的SQL,进行索引优化或者SQL改写,提升数据库整体性能。
另外需要注意,生产环境中如果开启日志,要定期清理日志文件,避免日志文件过大占用过多磁盘空间。