1.慢查詢的用途
它能記錄下所有執行超過long_query_time時間的SQL語句,幫我們找到執行慢的SQL,方便我們對這些SQL進行優化。
2.查看是否開啓慢查詢
show variables like 'slow_query%';
slow_query_log = off,表示沒有開啓慢查詢
slow_query_log_file 表示慢查詢日誌存放的目錄
3.開啓慢查詢(需要的時候纔開啓,因爲很耗性能,建議使用即時性的)
方式一:(即時性的,重啓mysql之後失效,常用的)
set global slow_query_log=1;
或者
set global slow_query_log=ON;
開啓之後 我們會發現 /var/lib/mysql下已經存在 localhost-slow.log了,未開啓的時候默認是不存在的。
方式二:(永久性的)
在/etc/my.cfg文件中的[mysqld]中加入:
slow_query_log=ON
slow_query_log_file=/var/lib/mysql/localhost-slow.log
4.設置慢查詢記錄的時間
查詢慢查詢記錄的時間:show variables like ‘long_query%’,默認是10秒鐘,意思是大於10秒纔算慢查詢。
我們現在設置慢查詢記錄時間爲1秒:
set long_query_time=1;
5.執行select count(1) from order o where o.user_id in (select u.id where users);
因爲我們開啓了慢查詢,且設置了超過1秒鐘的就爲慢查詢,此sql執行了24秒,所以屬於慢查詢。
我們在日誌中查看:
more /var/lib/mysql/localhost-slow.log
我們可以看到查詢的時間,用戶,花費的時間,使用的數據庫,執行的sql語句等信息。在生產上我們就可以使用這種方式來查看 執行慢的sql。
6.查詢慢查詢的次數:show status like ‘slow_queries’;
在我們重新執行剛剛的查詢sql後,查詢慢查詢的次數會變爲8
當然,用 more /var/lib/mysql/localhost-slow.log 也是可以看到詳細結果的。
在生產中,我們會分析查詢頻率高的,且是慢查詢的sql,並不是每一條查詢慢的sql都需要分析。
7.慢查詢日誌分析工具Mysqldumpslow
由於在生產上會有很多慢查詢,所以採用上述的方法查看慢查詢sql會很麻煩,還好MySQL提供了慢查詢日誌分析工具Mysqldumpslow。
其功能是, 統計不同慢sql的出現次數(Count),執行最長時間(Time),累計總耗費時間(Time),等待鎖的時間(Lock),發送給客戶端的行總數(Rows),掃描的行總數(Rows)
(1)查詢Mysqldumpslow的幫助信息,隨便進入一個文件夾下,執行:mysqldumpslow --help
查看mysqldumpslow命令安裝在哪個目錄:
whereis mysqldumpslow
說明:
- -s,是order的順序,主要有c(按query次數排序)、t(按查詢時間排序)、l(按lock的時間排序)、r (按返回的記錄數排序)和 at、al、ar,前面加了a的代表平均數
- -t,是top n的意思,即爲返回前面多少條的數據
- -g,後邊可以寫一個正則匹配模式,大小寫不敏感的
- -r:倒序
(2)案例:取出耗時最長的兩條sql
格式:mysqldumpslow -s t -t 2 慢日誌文件
mysqldumpslow -s t -t 2 /var/lib/mysql/localhost-slow.log
參數分析:
- 出現次數(Count),
- 執行最長時間(Time),
- 累計總耗費時間(Time),
- 等待鎖的時間(Lock),
- 發送給客戶端的行總數(Rows),
- 掃描的行總數(Rows),
- 用戶以及sql語句本身(抽象了一下格式, 比如 limit 1, 20 用 limit N,N 表示).
(3)案例:取出查詢次數最多,且使用了in關鍵字的1條sql
mysqldumpslow -s c -t 1 -g 'in' /var/lib/mysql/localhost-slow.log
這種方式更加方便,更加快捷!
8.show profile
用途:用於分析當前會話中語句執行的資源消耗情況
(1)查看是否開啓profile,mysql默認是不開啓的,因爲開啓很耗性能
show variables like 'profiling%';
(2)開啓profile(會話級別的,關閉當前會話就會恢復原來的關閉狀態)
set profiling=1;
或者
set profiling=ON;
(3)關閉profile
set profiling=0;
或者
set profiling=OFF;
(4)顯示當前執行的語句和時間
show profiles;
(5)顯示當前查詢語句執行的時間和系統資源消耗
show profile cpu,block io for query 4;
(分析show profiles中query_id等於4的sql所佔的CPU資源和IO操作)
或者直接 :
show profile for query 4;