1. 程式人生 > >Mysql慢查詢日誌詳解(slow_query_log)

Mysql慢查詢日誌詳解(slow_query_log)

引言

Mysql中比較重要的日誌包括二進位制日誌、relay_log(中繼日誌)、慢查詢日誌、redo_log、undo_log等,本篇來聊一聊mysql的慢查詢日誌。

程式中定位一個執行慢的SQL可以根據慢查詢日誌,預設情況下,慢查詢日誌禁用,因為開啟慢查詢日誌或多或少的會對mysql的效能產生一些影響。在慢查詢日誌功能開啟時,只有SQL執行時間超過long_query_time引數值的的語句才會在慢查詢日誌中記錄。long_query_time引數,最小值和預設值分別為0  10,單位為秒。

慢查詢日誌引數

slow_query_log:是否開啟慢查詢日誌

long_query_time:查詢閾值,超過了該閾值則記錄到慢查詢日誌中

log_output:如何儲存慢查詢日誌,可選項:FILE或者TABLE

slow_query_log_file:以FILE型別儲存慢查詢日誌時的儲存位置

預設情況下,如果沒有為慢查詢日誌指定名稱,預設為host_name-slow.log,下面進入mysql中看下:

可通過set global slow_query_log on;這樣的命令設定慢查詢日誌相關引數,也可設定mysql配置檔案/etc/my.cnf裡配置。

如上是將慢查詢日誌輸出到file中,也可以將其輸送到表中,具體的引數為 log_output

更改為TABLE儲存後,預設儲存在mysql.slow_log表中。

其他相關引數:

log_queries_not_using_indexes:取值on或者off,慢查詢日誌是否包含不使用索引進行查詢的查詢,通俗點說就是沒使用到索引的查詢SQL均會記錄到慢查詢日誌中;

log-short-format:開啟此引數後,伺服器會將較少(更加緊湊)的日誌資訊寫入慢查詢日誌,節約磁碟空間;

log_slow_admin_statements:啟用該引數後後會將 ALTER TABLE, ANALYZE TABLE, CHECK TABLE, CREATE INDEXDROP INDEX, OPTIMIZE TABLE

,和 REPAIR TABLE語句也記錄至慢查詢日誌;

log_throttle_queries_not_using_indexes :當log_queries_not_using_indexs引數後,沒使用索引的查詢SQL蹭蹭的寫入man查詢日誌,導致慢查詢日誌快速增長,這個引數開啟後即可對這些SQL設定速率限制;

 log_slow_slave_statements :主從複製時候不會將複製查詢寫入慢查詢日誌。

Mysql慢查詢日誌示例內容

我以如下SQL語句執行,記錄的慢查詢日誌為例(前提是你開啟了慢查詢日誌功能 set global slow_query_log=on;),慢查詢日誌預設儲存在mysql安裝目錄中的data目錄下且預設以FILE儲存

mysql> select sleep(11);

執行完畢後檢視慢查詢日誌檔案

如果啟用了慢查詢日誌並將FILE其選為輸出目標,則寫入日誌的每個語句前面都有一個以#字元開頭 且包含這些欄位的行(所有欄位都在一行中):

  • Query_time: duration

    語句執行時間(以秒為單位)

  • Lock_time: duration

    在幾秒鐘內獲得鎖定的時間

  • Rows_sent: N

    傳送到客戶端的行數。

  • Rows_examined: 

    優化程式檢查的行數

寫入慢查詢日誌檔案的每個語句前面都有一個SET 語句,該語句包含一個時間戳,指示何時記錄的慢語句(在語句完成執行後發生)。

Mysql慢查詢日誌是否要開啟,請謹慎決策,因為開啟慢查詢日誌後會對mysql效能產生些影響,如果你設定的慢查詢日誌儲存格式為FILE,還會額外消耗線上伺服器的磁碟空間。

參考資料:Mysql官網慢查詢日誌(https://dev.mysql.com/doc/refman/5.7/en/slow-query-log.html)

引申閱讀:

Mysql主從複製-基於GTID的複製

Mysql主從複製-基於日誌點的複製