Mysql开启慢查询及日志分析


在这里插入图片描述

一、为什么要开启慢查询

造成查询性能低下的原因多半是数据较多,开启mysql的慢查询,将查询所需时间较长的SQL语句记录到日志里,有利于我们更好的地位问题所在,并进行优化。

二、造成mysql查询较慢几种常见的原因

2.1 查询所有的列

select *会给服务器带来额外的I/O内存cup的消耗,还会造成无法优化器无法完成索引覆盖扫描这类优化。

2.2 查询出不必要的记录

例如从一个文章网站,服务端查询出所有的文章数据都返回给了客户端,但是客户端只要10篇文章并进行渲染,这也会给服务器造成额外消耗,最好使用limit来进行获取。

2.3 查询反复出现的记录

例如,网站的一个首页,有些数据是更新次数较少,我们反复查询这些数据。这时候,使用缓存可能会使性能更好。

2.4 多表关联时返回全部列

有三个表需要进行关联,我们不要把三个表所有的列都查出来,用哪个表的哪些列就指定上,要是不指定,和select *有什么区别?

在这里插入图片描述

三、查看mysql慢查询的配置及状态

mysql> show variables like 'slow_query%';
+---------------------+---------------------------------+
| Variable_name       | Value                           |
+---------------------+---------------------------------+
| slow_query_log      | ON                              |
| slow_query_log_file | /www/server/data/mysql-slow.log |
+---------------------+---------------------------------+
2 rows in set (0.00 sec)
mysql> show variables like 'long_query_time';
+-----------------+----------+
| Variable_name   | Value    |
+-----------------+----------+
| long_query_time | 1.000000 |
+-----------------+----------+
1 row in set (0.00 sec)

参数说明:

参数名 含义
slow_query_log 开启状态,on开启 off关闭
slow_query_log_file 慢查询日志保存位置
long_query_time 超过多长时间才记录到日志里

四、如何开启慢查询

4.1 方法1

设置开启状态

mysql> set global slow_query_log='ON'; 

设置日志保存位置

扫描二维码关注公众号,回复: 13119409 查看本文章
mysql>  set global slow_query_log_file='/www/server/data/mysql-slow.log';

设置超时记录时间

set global long_query_time=1;
4.2 方法2

修改配置文件my.cnf,在mysqld下的下方加入:

slow_query_log = ON
slow_query_log_file = /www/server/data/mysql-slow.log
long_query_time = 1

五、进行测试

mysql> select sleep(2),username from fa_cp_users;
+----------+----------+
| sleep(2) | username |
+----------+----------+
|        0 | nice666  |
+----------+----------+
1 row in set (2.00 sec)

查询时长已超过两秒,去配置文件查看,发现已有mysql-slow.log文件:

[root@VM_0_10_centos ~]# cd /www/server/data
[root@VM_0_10_centos data]# ll
total 341828
-rw-rw---- 1 mysql mysql        56 Nov 13  2019 auto.cnf
drwx------ 2 mysql mysql      4096 Dec 11  2019 bishe
drwx------ 2 mysql mysql      4096 Jan 18 18:45 brushorder
drwx------ 2 mysql mysql      4096 Feb 16 13:49 caipiao
drwx------ 2 mysql mysql      4096 Nov 27  2019 daijia
drwx------ 2 mysql mysql      4096 Dec 13  2019 dht
-rw-rw---- 1 mysql mysql  77594624 Jun 14 10:50 ibdata1
-rw-rw---- 1 mysql mysql 134217728 Jun 14 10:50 ib_logfile0
-rw-rw---- 1 mysql mysql 134217728 May 23 04:58 ib_logfile1
drwx------ 2 mysql mysql      4096 Dec 21 11:17 linmaocheng
drwx------ 2 mysql mysql      4096 Dec 17 18:32 ljk
drwx------ 2 mysql mysql      4096 Nov 13  2019 mysql
-rw-rw---- 1 mysql mysql   3124759 Jun 12 11:28 mysql-bin.000036
-rw-rw---- 1 mysql mysql     91172 Jun 14 09:13 mysql-bin.000037
-rw-rw---- 1 mysql mysql        38 Jun 12 11:28 mysql-bin.index
-rw-rw---- 1 mysql mysql       218 Jun 14 11:10 mysql-slow.log
drwx------ 2 mysql mysql      4096 Feb 29 11:58 mytool
drwx------ 2 mysql mysql      4096 Nov 13  2019 performance_schema
drwx------ 2 mysql mysql      4096 Dec 13  2019 RedLetter
drwx------ 2 mysql mysql     12288 Nov 21  2019 RedPacket
drwx------ 2 mysql mysql      4096 May  6 10:43 smallfox
drwx------ 2 mysql mysql      4096 May  8 17:02 studyfast
-rw-rw---- 1 mysql mysql    673013 Jun 14 10:13 VM_0_10_centos.err
-rw-rw---- 1 mysql mysql         6 Jun 12 11:28 VM_0_10_centos.pid
drwx------ 2 mysql mysql     12288 Apr 25 22:32 yuerjia
[root@VM_0_10_centos data]# vim mysql-slow.log

查看mysql-slow.log文件内容:

# Time: 200614 11:10:53
# User@Host: root[root] @ localhost []  Id: 18230
# Query_time: 2.000251  Lock_time: 0.000082 Rows_sent: 1  Rows_examined: 1
SET timestamp=1592104253;
select sleep(2),username from fa_cp_users;

六、参数详解

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

七、总结

  • mysql还有一些工具,例如,mysqldumpslow。能够帮我们更好的做日志分析。
  • 分析sql效率方案千万条,掌握一条是一条。

猜你喜欢

转载自blog.csdn.net/qq_42249896/article/details/106714696