在mysql当中如何定位慢查询

102 阅读3分钟

在使用 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

image.png

image.png

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 关键字以及性能模式等方式找到慢查询语句,然后进行优化。