MySQL 数据库慢查询主要用于跟踪异常的 SQL 语句,可以分析出当前程序里哪些SQL 语句比较耗费资源,慢查询日志则用来记录在 MySQL 中响应时间超过阀值的语句,具体指运行时间超过 long_qu ery_time 值的 QL 语句,会被记录到慢查询日志中。
MySQL 数据库默认没有开启慢查询日志功能,需手动在配置文件或者 MySQL 令行中开启,慢查询日志默认写入磁盘中的文件,也可以将慢查询日志写入到数据库表中。
查看数据库是否开启慢查询,命令如下
MariaDB [(none)]> show variables like "%slow%";
+---------------------+--------------------------------------------------------------------------------------------------------------+
| Variable_name | Value |
+---------------------+--------------------------------------------------------------------------------------------------------------+
| log_slow_filter | admin,filesort,filesort_on_disk,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk |
| log_slow_queries | OFF |
| log_slow_rate_limit | 1 |
| log_slow_verbosity | |
| slow_launch_time | 2 |
| slow_query_log | OFF |
| slow_query_log_file | yun1-slow.log |
+---------------------+--------------------------------------------------------------------------------------------------------------+
7 rows in set (0.00 sec)
MariaDB [(none)]> show variables like "%long_query%";
+-----------------+-----------+
| Variable_name | Value |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+
1 row in set (0.00 sec)
MySQL 慢查询参数详解如下:
log_ slow queries 关闭慢查询日志功能。
a long_query_time :慢查询超时时间,默认为 lOs,MySQL 5. 以上可 以设置微秒
slow_query_log :关闭慢查询日志。
slow_query log_file :慢查询日志文件。
slow aunch_time: thread create 时间,单位为秒,如果 thread create 的时间超过了这个值,该变量 slow_launch_ time 的值会加1
log-quer es-not using-indexes :记录未添加索引的 SQL 语句
开启 MySQL 慢查询日志方法有以下两种:
(1) MySQL 数据库命令行执行命令如下:
MariaDB [(none)]> set global slow_query_log = on;
Query OK, 0 rows affected (0.00 sec)
MariaDB [(none)]> show variables like "%slow%";
+---------------------+--------------------------------------------------------------------------------------------------------------+
| Variable_name | Value |
+---------------------+--------------------------------------------------------------------------------------------------------------+
| log_slow_filter | admin,filesort,filesort_on_disk,full_join,full_scan,query_cache,query_cache_miss,tmp_table,tmp_table_on_disk |
| log_slow_queries | ON |
| log_slow_rate_limit | 1 |
| log_slow_verbosity | |
| slow_launch_time | 2 |
| slow_query_log | ON |
| slow_query_log_file | yun1-slow.log |
+---------------------+--------------------------------------------------------------------------------------------------------------+
7 rows in set (0.00 sec)
(2 )编辑 my.cnf 配置文件中添加代码如下
vim /etc/my.cnf
log-slow-queries = /data/mysql/localhost. log
long_query_time = 0.01
log-queries-not-using-indexes
慢查询功能开启之后,数据库会自动将执行时间超过设定时间的 SQL 语句陈加至慢询日志文件中,可以通过慢查询日志文件定位执行慢的 SQL ,从而对其优化,可以通过mysqldumpslow 命令行工具分析日志。
执行命令 mysqldumps ow 可以查看命令帮助信息,主要参数包括-s 和-t,其中-s是排序参数,可选项详解如下
l: 查询锁的总时间。
r: 返回记录数。
t: 查询总时间排序。
al: 平均锁定时间。
ar: 平均返回记录数
at: 平均 询时间
c: 计数
-t n:显示头 条记录
MySQL 慢查询 mysqldumpslow 按照返回的行数从大到小,查看前 行
# cd /var/lib/mysql
mysqldumpslow -s r -t 2 yun1-slow.log
Reading mysql slow query log from yun1-slow.log
Count: 1 Time=0.00s (0s) Lock=0.00s (0s) Rows_sent=0.0 (0), Rows_examined=0.0 (0), 0users@0hosts
Died at /usr/bin/mysqldumpslow line 178, <> chunk 1
MySQL 慢查询 mysqldumpslow 按照查询总时间从大到小,查看前 行,同时过滤select SQL 语句
[root@yun1 mysql]# mysqldumpslow -s r -t 5 -g "select" yun1-slow.log
Reading mysql slow query log from yun1-slow.log
Died at /usr/bin/mysqldumpslow line 178, <> chunk 1.