怎樣定位mysql中執行效率差的SQL語句/查詢mysql中執行過的慢sql語句?

慢查詢日誌概念

mysql慢查詢日誌是mysql日共記錄日誌的一種也是幫助定位查詢較慢的sql的一種手段,他用來記錄超過long_query_time設定值的sql,超過這個閥值mysql就會將其記錄下來,寫進slow_query_log_file配置好的日誌文件中。默認的情況下mysql是關閉慢查詢的功能的,因爲開啓慢查詢功能會消耗一部分的系統資源,所以一般來說我們的生產環境也是不建議開啓的。
涉及部分相關參數:

  • slow_query_log :是否開啓慢查詢日誌,1表示開啓,0表示關閉。當我們有些版本的數據庫也會用“on”或者“off”
  • log-slow-queries
    :舊版(5.6以下版本)MySQL數據庫慢查詢日誌存儲路徑。可以不設置該參數,系統則會默認給一個缺省的文件host_name-slow.log
  • slow-query-log-file:新版(5.6及以上版本)MySQL數據庫慢查詢日誌存儲路徑。可以不設置該參數,系統則會默認給一個缺省的文件host_name-slow.log
  • long_query_time :慢查詢閾值,當查詢時間多於設定的閾值時,記錄日誌。默認值10s
  • log_queries_not_using_indexes:未使用索引的查詢也被記錄到慢查詢日誌中(可選項)。
  • log_output:日誌存儲方式。log_output=‘FILE’表示將日誌存入文件,默認值是’FILE’。log_output='TABLE’表示將日誌存入數據庫,這樣日誌信息就會被寫入到mysql.slow_log表中。MySQL數據
    庫支持同時兩種日誌存儲方式,配置的時候以逗號隔開即可,如:log_output=‘FILE,TABLE’。日誌記錄到系統的專用日誌表中,要比記錄到文件耗費更多的系統資源,因此對於需要啓用慢查詢日誌,又需
    要能夠獲得更高的系統性能,那麼建議優先記錄到文件。

慢查詢設置

1、日誌式
mysql默認情況下slow_query_log的值時“OFF”也就是關閉狀態。在我我們定位一下慢sql的時候需要先查看當前狀態可以通過查詢VARIABLES查看相關參數例如
查看設置:

show VARIABLES like "%QUERY%"; --查看參數名稱中帶有“QUERY”的參數
show VARIABLES like "%log_output%"; --查看參數名稱中帶有“log_output”的參數

修改設置:set GLOBAL [key]=[value]

set GLOBAL slow_query_log=`ON`; --此方式只對當前生效,一旦數據庫重啓便會失效

永久生效:修改my.cnf配置文件增加參數或修改參數重啓服務器即可

slow_query_log=ON
long_query_time=10
slow_query_log_file=/usr/local/mysql/data/localhost-slow.log

#慢查詢的參數slow_query_log_file ,它指定慢查詢日誌文件的存放路徑,系統默認會給一個缺省的文件host_name-slow.log

2、表格式
log_output參數適用來指定日誌的存儲方式的參數,他是一個枚舉類型,有“FILE”和“TABLE”兩個值。默認值爲“FILE”。當然mysql也支持兩種方式中間用逗號隔開log_output=‘FILE,TABLE’。但是一般來說我們統一建議時將日誌記錄到日誌文件中,因爲相較於記錄到日誌表來說。記錄到日誌文件要節省性能些,但是我們更希望的是關閉
查看設置

show VARIABLES like "%log_output%"; --查看參數名稱中帶有“log_output”的參數

修改設置

set GLOBAL log_output=`FILE`; --此方式只對當前生效,一旦數據庫重啓便會失效,需要的話在配置文件中增加或修改

如果是記錄到表格中的話可以通過普通的sql查詢你符合條件的記錄:
在這裏插入圖片描述
其他
系統參數log_queries_not_using_indexes在你進行調優的時候也是一個不可多得的一個參數,他可以開啓或者關閉是否記錄沒有使用索引的慢sql。默認情況下是關閉狀態(“OFF”)。
在這裏插入圖片描述

系統參數log_show_admin_statements表示的是是否將慢管理語句例如ANALYZE TABLE和ALTER TABLE等記入慢查詢日誌

show variables like 'log_slow_admin_statements';

在這裏插入圖片描述

統計慢查詢的條數:

show global status like '%slow_queries%';

mysql日誌分析工具
在實際的使用過程中我們要定位慢sql有時候需要去真是的生產環境中分析日誌,所以一般來說我們都會以日誌文件的形式記錄慢sql,但是這樣的話我們分析的工作就變的體力活了。所以我們的mysql給我們提供了日誌分析工具mysqldumpslow。這個工具可以大幅度的提高我們的分析效率。

mysqldumpslow參數解析:
在這裏插入圖片描述

-s, 是表示按照何種方式排序
    c: 訪問計數
    l: 鎖定時間
    r: 返回記錄
    t: 查詢時間
    al:平均鎖定時間
    ar:平均返回記錄數
    at:平均查詢時間
-t,top n的意思,即爲返回前面多少條的數據;
-g, 後邊可以寫一個正則匹配模式,大小寫不敏感的;

比如:
得到返回記錄集最多的10個SQL。

mysqldumpslow -s r -t 10 /database/mysql/mysql06_slow.log

得到訪問次數最多的10個SQL

mysqldumpslow -s c -t 10 /database/mysql/mysql06_slow.log

得到按照時間排序的前10條裏面含有左連接的查詢語句。

mysqldumpslow -s t -t 10 -g “left join/database/mysql/mysql06_slow.log

另外建議在使用這些命令時結合 | 和more 使用 ,否則有可能出現刷屏的情況。

mysqldumpslow -s r -t 20 /mysqldata/mysql/mysql06-slow.log | more
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章