一、爲什麼要開啓慢查詢
造成查詢性能低下的原因多半是數據較多,開啓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效率方案千萬條,掌握一條是一條。