面试题答案
一键面试开启慢查询日志
- 临时开启: 在MySQL命令行中执行以下语句:
SET GLOBAL slow_query_log = 1;
这只是临时生效,MySQL服务重启后设置会失效。
- 永久开启:
修改MySQL配置文件(通常是
my.cnf
或my.ini
),在[mysqld]
部分添加或修改以下配置:
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow-query.log # 日志文件路径可自定义
修改完成后重启MySQL服务。
慢查询日志关键信息
- 查询语句:完整的SQL查询语句,用于直接查看执行的具体操作。
- 执行时间:查询执行所花费的时间,以秒为单位,这是判断查询是否为慢查询的关键指标。
- 锁等待时间:如果查询涉及锁操作,会记录等待锁的时间,可用于分析锁争用情况。
- 扫描的行数:查询执行过程中扫描的表行数,反映查询对数据的访问量。
- 唯一检查行数:如果查询包含唯一性检查,记录检查的行数。
基于关键信息初步定位慢查询原因
- 查询语句分析:
- 查看是否存在复杂的子查询、连接操作过多等情况。过多的子查询或复杂的连接可能导致查询优化器难以生成高效执行计划。
- 检查是否有全表扫描。若扫描行数过多且没有合理的索引,可能需要添加合适索引。
- 执行时间:
- 若执行时间过长,且扫描行数不多,可能是锁等待或资源瓶颈(如CPU、内存、磁盘I/O)导致。
- 长时间的锁等待可能意味着表设计不合理或事务控制不当,需要优化表结构或事务处理逻辑。
- 锁等待时间:
- 若锁等待时间占比较大,说明存在锁争用。可能是事务隔离级别设置不当,或者并发操作过于频繁,需要调整事务隔离级别或优化并发访问策略。
- 扫描行数:
- 大量的扫描行数通常意味着查询没有利用好索引。通过分析查询条件,为相关列添加合适的索引,减少扫描行数,提高查询效率。