文章目录

一、为什么要开启慢查询
造成查询性能低下的原因多半是数据较多,开启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效率方案千万条,掌握一条是一条。