MySQL性能優化(七)-- 慢查詢

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;

在這裏插入圖片描述
原文鏈接

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章