1、慢查询日志介绍

数据库查询快慢是影响项目性能的一大因素,对于数据库,我们除了要优化  SQL,更重要的是得先找到需要优化的SQL。MySQL数据库有一个“慢查询日志”功能,用来记录查询时间超过某个设定值的SQL语句,这将极大程度帮助我们快速定位到症结所在,以便对症下药。

至于查询时间的多少才算慢,每个项目、业务都有不同的要求。

MySQL的慢查询日志功能默认是关闭的,需要手动开启。

2、开启慢查询功能

查看是否开启慢查询功能

mysql慢sql日志 mysql 慢日志查询_sql

 

参数说明:

- 【slow_query_log】	:是否开启慢查询日志,1为开启,0为关闭。
- 【 log-slow-queries】	:旧版(5.6以下版本)MySQL数据库慢查询日志存储路径。可以不设置 该参数,系统则会默认给一个缺省的文件host_name-slow.log
- 【slow-query-log-file】:新版(5.6及以上版本)MySQL数据库慢查询日志存储路径。可以不设置该参数,系统则会默认给一个缺省的文件host_name-slow.log
- 【long_query_time】 :慢查询阈值,当查询时间多于设定的阈值时,记录日志,【单位为秒】。

临时开启慢查询功能

在 MySQL 执行 SQL 语句设置,但是如果重启 MySQL 的话将失效 

set global slow_query_log = ON;
set global long_query_time = 1;

mysql慢sql日志 mysql 慢日志查询_mysql_02

 

永久开启慢查询功能

修改/etc/my.cnf配置文件,重启 MySQL, 这种永久生效.

[mysqld]
slow_query_log=ON
long_query_time=1

3、慢查询日志格式 

mysql慢sql日志 mysql 慢日志查询_sql_03

 

mysql慢sql日志 mysql 慢日志查询_mysql_04

 

格式说明:

第一行,SQL查询执行的具体时间

第二行,执行SQL查询的连接信息,用户和连接IP

第三行,记录了一些我们比较有用的信息,如下解析 

Query_time,这条SQL执行的时间,越长则越慢
Lock_time,在MySQL服务器阶段(不是在存储引擎阶段)等待表锁时间
Rows_sent,查询返回的行数
Rows_examined,查询检查的行数,越长就当然越费时间

第四行,设置时间戳,没有实际意义,只是和第一行对应执行时间。

第五行及后面所有行(第二个# Time:之前),执行的sql语句记录信息,因为sql可能会很长。

4、分析慢查询日志的工具

使用mysqldumpslow工具,mysqldumpslow是MySQL自带的慢查询日志工具。可以使用

mysqldumpslow工具搜索慢查询日志中的SQL语句。

得到按照时间排序的前10条里面含有左连接的查询语句:

[root@localhost mysql]# mysqldumpslow -s t -t 10 -g "left join"
/var/lib/mysql/slow.log

常用参数说明:

-s:是表示按照何种方式排序al 平均锁定时间

al 平均锁定时间
ar 平均返回记录时间
at 平均查询时间(默认)
c 计数
l 锁定时间r 返回记录t 查询时间

ar 平均返回记录时间

at 平均查询时间(默认)

c 计数

l 锁定时间r 返回记录t 查询时间

-t:是top n的意思,即为返回前面多少条的数据

-g:后边可以写一个正则匹配模式,大小写不敏感的

[root@mysql132 mysql]# mysqldumpslow -s t /var/lib/mysql/mysql132-slow.log


Reading mysql slow query log from /var/lib/mysql/mysql132-slow.log
Count:1 Time=143.16s(143s) Lock=0.00(0s) Rows=27907961.0(27907961)


root[root]@localhost
select * from t_slow a left join t_slow b on a.name=b.name


Count: 5	Time=5.80s (28s)	Lock=0.00s (0s)	Rows=0.0 (0), root[root]@localhost
insert into t_slow(name,address) select name,address from t_slow


Count: 1	Time=3.01s (3s)	Lock=0.00s (0s)	Rows=1.0 (1), root[root]@localhost
select sleep(N)

如果您觉得文章好看,欢迎点赞收藏加关注,一连三击呀,您的肯定是我持续输出的动力,感谢!!☺☻