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 INDEX
,DROP 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)
引申閱讀: