在使用 MySQL 数据库时,慢查询是一个常见的性能问题。当数据量非常大的时候,数据库响应变慢,影响到应用程序的性能时,定位并优化慢查询就显得尤为重要。
1. 开启慢查询日志
慢查询日志是 MySQL 提供的一个非常有用的工具,它可以记录执行时间超过指定阈值的 SQL 语句。
1.1 临时开启
可以通过以下 SQL 语句临时开启慢查询日志,该设置在 MySQL 服务重启后会失效。
-- 查看慢查询日志是否开启
SHOW VARIABLES LIKE 'slow_query_log';
-- 开启慢查询日志
SET GLOBAL slow_query_log = 'ON';
-- 查看慢查询时间阈值(单位:秒)
SHOW VARIABLES LIKE 'long_query_time';
-- 设置慢查询时间阈值,例如设置为 2 秒
SET GLOBAL long_query_time = 2;
1.2 永久开启
若要永久开启慢查询日志,需要修改 MySQL 的配置文件(通常是 my.cnf 或 my.ini)。在文件中添加或修改以下配置:
[mysqld]
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 2
修改完成后,重启 MySQL 服务使配置生效。
或者使用开源工具
调试工具:Arthas
运维工具:Prometheus 、Skywalking
2. 分析慢查询日志
开启慢查询日志后,MySQL 会将符合条件的 SQL 语句记录到指定的日志文件中。我们可以使用一些工具来分析这些日志。
2.1 使用 mysqldumpslow 工具
mysqldumpslow 是 MySQL 自带的一个用于分析慢查询日志的工具。以下是一些常用的使用示例:
# 按照查询次数排序,显示前 10 条慢查询
mysqldumpslow -s c -t 10 /var/log/mysql/mysql-slow.log
# 按照查询时间排序,显示前 10 条慢查询
mysqldumpslow -s t -t 10 /var/log/mysql/mysql-slow.log
2.2 使用 pt-query-digest 工具
pt-query-digest 是 Percona Toolkit 中的一个强大工具,它可以对慢查询日志进行更详细的分析。
# 分析慢查询日志
pt-query-digest /var/log/mysql/mysql-slow.log
3. 使用 SHOW PROCESSLIST 命令
SHOW PROCESSLIST 命令可以显示当前 MySQL 服务器中正在执行的线程信息,包括线程的状态、执行时间、SQL 语句等。
SHOW PROCESSLIST;
如果发现某个线程的执行时间很长,可以通过 Id 字段找到对应的线程,并使用 KILL 命令杀死该线程
4. 使用 EXPLAIN 分析 SQL 语句
当定位到慢查询的 SQL 语句后,可以使用 EXPLAIN 关键字来分析该语句的执行计划。EXPLAIN 会显示 MySQL 如何执行 SQL 语句,包括表的读取顺序、索引的使用情况等。
EXPLAIN SELECT * FROM users WHERE age > 20;
5. 使用性能模式(Performance Schema)
MySQL 的性能模式(Performance Schema)可以提供更详细的性能监控信息。通过查询性能模式的相关表,可以获取 SQL 语句的执行时间、锁等待时间等信息。
-- 查看执行时间最长的前 10 条 SQL 语句
SELECT
digest_text,
SUM(timer_wait) / 1000000000000 AS total_time_ms
FROM
performance_schema.events_statements_summary_by_digest
GROUP BY
digest_text
ORDER BY
total_time_ms DESC
LIMIT 10;
总结
定位 MySQL 慢查询是一个系统的过程,需要综合运用多种工具和方法。通过开启慢查询日志、分析日志文件、使用 SHOW PROCESSLIST 命令、EXPLAIN 关键字以及性能模式等方式找到慢查询语句,然后进行优化。