面试题答案
一键面试开启慢查询日志
- 修改配置文件(以Linux系统为例,假设MySQL配置文件为
my.cnf
):- 打开
my.cnf
文件,在[mysqld]
部分添加或修改以下配置参数:slow_query_log = 1 slow_query_log_file = /var/log/mysql/slow - query.log long_query_time = 2
slow_query_log = 1
表示开启慢查询日志,设置为0则关闭。slow_query_log_file
指定慢查询日志文件的路径,可根据实际情况调整。long_query_time
定义查询执行时间超过多少秒算慢查询,这里设置为2秒,可按需调整。
- 修改完成后,保存文件并重启MySQL服务,使配置生效。例如在CentOS系统中可以使用命令
systemctl restart mysqld
。
- 打开
- 使用SQL语句动态开启(临时生效,MySQL重启后失效):
- 登录MySQL客户端,执行以下命令:
SET GLOBAL slow_query_log = 1; SET GLOBAL slow_query_log_file = '/var/log/mysql/slow - query.log'; SET GLOBAL long_query_time = 2;
- 同样,
slow_query_log
设置为1开启,slow_query_log_file
指定日志文件路径,long_query_time
设置慢查询时间阈值。
- 登录MySQL客户端,执行以下命令:
分析慢查询日志中的数据定位性能问题
- 查看日志文件:直接打开慢查询日志文件(如
/var/log/mysql/slow - query.log
)查看其中的记录。每条记录通常包含查询的执行时间、锁等待时间、扫描的行数等关键信息。例如:# Time: 230612 16:12:34 # User@Host: root[root] @ localhost [] # Query_time: 3.501234 Lock_time: 0.000123 Rows_sent: 100 Rows_examined: 10000 SELECT * FROM large_table WHERE some_column = 'value';
Query_time
表示查询执行时间,这里是3.501234秒。Lock_time
是锁等待时间,0.000123秒。Rows_sent
是返回给客户端的行数,100行。Rows_examined
是查询扫描的行数,10000行。
- 使用工具分析:
- mysqldumpslow:这是MySQL自带的分析慢查询日志的工具。
- 基本语法:
mysqldumpslow [options] log - file
- 常用选项:
-s c
:按查询执行次数排序。例如mysqldumpslow -s c /var/log/mysql/slow - query.log
,可以找出执行次数较多的慢查询,这些查询即使每次执行时间不是很长,但累积起来也可能影响性能。-s t
:按查询执行时间排序。如mysqldumpslow -s t /var/log/mysql/slow - query.log
,可以快速定位执行时间最长的查询。-t n
:只显示前n条记录。例如mysqldumpslow -s t -t 10 /var/log/mysql/slow - query.log
,显示执行时间最长的前10条慢查询。
- 基本语法:
- pt - query - digest:Percona Toolkit中的一个工具,功能更强大。
- 安装Percona Toolkit后,使用语法:
pt - query - digest [options] log - file
- 它能对慢查询日志进行详细分析,生成更全面的报告,包括查询的平均执行时间、最大执行时间、查询模式分析等。例如执行
pt - query - digest /var/log/mysql/slow - query.log
,会输出详细的分析报告,帮助定位性能瓶颈。
- 安装Percona Toolkit后,使用语法:
- mysqldumpslow:这是MySQL自带的分析慢查询日志的工具。
- 分析查询语句:
- 检查索引使用情况:如果
Rows_examined
远大于Rows_sent
,可能是索引使用不当。例如上述例子中扫描了10000行才返回100行,需要检查some_column
列是否有合适的索引。可以使用EXPLAIN
关键字对查询进行分析,如EXPLAIN SELECT * FROM large_table WHERE some_column = 'value';
,通过分析结果判断索引是否生效,是否需要添加或调整索引。 - 查看锁等待情况:
Lock_time
较长说明可能存在锁争用问题。检查查询涉及的表是否有频繁的读写操作,是否需要调整事务隔离级别或优化事务逻辑,减少锁的持有时间。 - 优化查询逻辑:对于复杂的查询,如多表连接查询,检查连接条件是否合理,是否可以通过调整连接顺序、使用临时表等方式优化查询性能。
- 检查索引使用情况:如果