面试题答案
一键面试开启MySQL慢查询日志
- 修改配置文件:
- 在MySQL配置文件(通常是
my.cnf
或my.ini
)中添加或修改以下配置项:[mysqld] slow_query_log = 1 # 开启慢查询日志,1表示开启,0表示关闭 slow_query_log_file = /var/log/mysql/slow - query.log # 设置慢查询日志文件路径,路径可根据实际情况调整 long_query_time = 2 # 设置查询执行时间阈值,单位为秒,超过此时间的查询会被记录到慢查询日志中,这里设置为2秒
- 保存配置文件后,重启MySQL服务使配置生效。例如在Linux系统中,可使用
sudo systemctl restart mysql
命令重启MySQL。
- 在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;
- 登录MySQL命令行,使用以下命令动态开启慢查询日志:
慢查询日志关键信息
- 查询语句:记录了执行时间较长的SQL语句,这是分析慢查询的核心内容,通过它可以了解查询的具体逻辑和操作的数据表。
- 查询执行时间:精确记录了该查询从开始到结束所花费的时间,单位为秒,通过这个时间可以直观判断查询的“慢”程度。
- 锁等待时间:如果查询涉及锁操作,会记录等待锁的时间,这对于分析因锁竞争导致的慢查询很重要。
- 扫描的行数:显示查询过程中扫描的数据行数,扫描行数过多可能意味着查询没有使用到合适的索引。
- 唯一扫描行数:表示查询中唯一扫描的行数,有助于分析查询的效率。
- 客户端信息:包括客户端的IP地址、连接的数据库用户等,方便定位发起慢查询的来源。
通过关键信息初步定位慢查询原因
- 查询语句分析:
- 复杂逻辑:如果查询包含大量的
JOIN
、子查询嵌套等复杂逻辑,可能导致性能问题。例如多表JOIN
时连接条件不合理,可能会产生笛卡尔积,使数据量急剧膨胀。 - 全表扫描:检查是否缺少必要的索引。若扫描行数过多且唯一扫描行数也多,很可能是全表扫描。例如在
WHERE
子句中的条件字段上没有索引,MySQL可能会对整个表进行扫描来获取满足条件的数据。
- 复杂逻辑:如果查询包含大量的
- 查询执行时间分析:
- 时间过长:若执行时间远超预期,结合扫描行数判断是否是数据量太大导致处理时间长。如果数据量正常,可能是查询逻辑问题或者服务器资源不足(如CPU、内存等)。
- 锁等待时间分析:
- 等待时间长:说明存在锁竞争。可能是多个事务同时访问相同的数据行,且事务隔离级别设置不合理。例如在高并发写入场景下,使用
SERIALIZABLE
隔离级别可能导致大量锁等待,可考虑调整为READ - COMMITTED
等更宽松的隔离级别。
- 等待时间长:说明存在锁竞争。可能是多个事务同时访问相同的数据行,且事务隔离级别设置不合理。例如在高并发写入场景下,使用
- 客户端信息分析:
- 特定客户端频繁出现慢查询:可能是该客户端的业务逻辑存在问题,频繁发起不合理的查询。例如某些应用程序在循环中执行SQL查询,而不是批量处理,增加了数据库的负担。