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'; 

設置日誌保存位置

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效率方案千萬條,掌握一條是一條。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章