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

1.慢查詢的用途mysql

它能記錄下全部執行超過long_query_time時間的SQL語句,幫咱們找到執行慢的SQL,方便咱們對這些SQL進行優化。sql

2.查看是否開啓慢查詢數據庫

show variables like 'slow_query%';markdown

img

slow_query_log = off,表示沒有開啓慢查詢工具

slow_query_log_file 表示慢查詢日誌存放的目錄性能

3.開啓慢查詢(須要的時候纔開啓,由於很耗性能,建議使用即時性的)優化

方式一:(即時性的,重啓mysql以後失效,經常使用的)spa

set global slow_query_log=1; 或者 set global slow_query_log=ON;日誌

開啓以後 咱們會發現 /var/lib/mysql下已經存在 localhost-slow.log了,未開啓的時候默認是不存在的。code

方式二:(永久性的)

在/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秒纔算慢查詢。

img

咱們如今設置慢查詢記錄時間爲1秒:set long_query_time=1;

img

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,

img

咱們能夠看到查詢的時間,用戶,花費的時間,使用的數據庫,執行的sql語句等信息。在生產上咱們就可使用這種方式來查看 執行慢的sql。

6.查詢慢查詢的次數:show status like 'slow_queries';

img

在咱們從新執行剛剛的查詢sql後,查詢慢查詢的次數會變爲8

img

固然,用 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

img

說明:

  • -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

img

參數分析:

  • 出現次數(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

img

這種方式更加方便,更加快捷!

8.show profile

用途:用於分析當前會話中語句執行的資源消耗狀況

(1)查看是否開啓profile,mysql默認是不開啓的,由於開啓很耗性能

show variables like 'profiling%';

img

(2)開啓profile(會話級別的,關閉當前會話就會恢復原來的關閉狀態)

set profiling=1; 或者 set profiling=ON;

(3)關閉profile

set profiling=0; 或者 set profiling=OFF;

(4)顯示當前執行的語句和時間

show profiles;

img

(5)顯示當前查詢語句執行的時間和系統資源消耗

show profile cpu,block io for query 4;(分析show profiles中query_id等於4的sql所佔的CPU資源和IO操做)

或者直接 : show profile for query 4;

img


歡迎關注個人公衆號,第一時間接收最新文章~ 搜索公衆號: 碼咖 或者 掃描下方二維碼:

img
相關文章
相關標籤/搜索