慢查询的使用
慢速查询日志可用于查找执行时间较长的查询,这对我们在做sql
性能优化有很大帮助。然而,检查一个文件较大的查询日志可能是一项耗时的任务。为了简化这一过程,您可以使用mysqldumpslow
命令来处理一个慢速查询日志文件并总结其内容。
定位慢查询
当我们在写web api
接口时常常会碰到某个接口需要很久才能返回结果,这时我们就应该去检查是不是慢查询导致的。定位慢 SQL 有如下两种解决方案:
- 查看
慢查询
日志 -
show processlist
查看正在执行的慢查询
查看慢查询
日志
检查慢查询
日志是否开启
慢查询可以帮我们找到执行慢的 SQL,在使用前,我们需要先看下慢查询是否已经开启,使用下面这条命令即可:
mysql> show variables like '%slow_query_log';
+----------------+-------+
| Variable_name | Value |
+----------------+-------+
| slow_query_log | OFF |
+----------------+-------+
1 row in set (0.00 sec)
开启慢查询日志
我们能看到slow_query_log=OFF
,也就是说慢查询日志此时是关上的。我们可以把慢查询日志打开,注意设置变量值的时候需要使用 global
,否则会报错:
mysql> set global slow_query_log = on;
Query OK, 0 rows affected (0.00 sec)
查看慢查询阀值
接下来我们来看下慢查询的时间阈值设置(默认值是10秒),使用如下命令:
mysql> show variables like '%long_query_time%';
+-----------------+-----------+
| Variable_name | Value |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
1 row in set (0.00 sec)
设置慢查询阀值
在这里我们一般建议线上业务把 long_query_time
设置为 1 秒,如果你当前业务要求比较高的QPS
,可设置慢查询为 0.1 秒。
mysql> set global long_query_time = 1;
Query OK, 0 rows affected (0.00 sec)
确定慢查询日志路径
mysql> show global variables like "datadir";
+---------------+------------------------+
| Variable_name | Value |
+---------------+------------------------+
| datadir | /data/mysql/data/3306/ |
+---------------+------------------------+
1 row in set (0.00 sec)
确定慢查询日志的文件名
mysql> show global variables like "slow_query_log_file";
+---------------------+----------------+
| Variable_name | Value |
+---------------------+----------------+
| slow_query_log_file | mysql-slow.log |
+---------------------+----------------+
1 row in set (0.00 sec)
根据上面的查询结果,可以直接查看 /data/mysql/data/3306/mysql-slow.log
文件获取已经执行完的慢查询。
日志文件参数介绍
参数名 | 含义 |
---|---|
Query_time |
查询时间 |
Lock_time |
等待表锁的时间 |
Rows_sent |
语句返回的行数 |
Rows_examined |
语句执行期间从存储引擎读取的行数 |
使用 show processlist
有时慢查询正在执行,已经导致数据库负载偏高了,而由于慢查询还没执行完,因此慢查询日志还看不到任何语句。此时可以使用 show processlist
命令判断正在执行的慢查询。show processlist
显示哪些线程正在运行。
mysql> show processlist\G`
*************************** 1. row ***************************
Id: 4
User: root
Host: localhost
db: NULL
Command: Query
Time: 0
State: starting
Info: show processlist
1 row in set (0.00 sec)
参数介绍
参数名 | 含义 |
---|---|
db |
数据库名 |
command |
连接状态,一般是休眠(sleep),查询(query),连接(connect) |
time |
连接持续时间,单位是秒 |
state |
显示当前sql语句的状态 |
info |
显示这个sql语句 |
我们这里可以通过它的执行时间(Time)来判断是否是慢 SQL。
网友评论