慢查詢日誌概念mysql
MySQL 的慢查詢日誌是 MySQL 提供的一種日誌記錄,它用來記錄在 MySQL 中查詢響應時間超過閾值的語句,具體指響應時間超過sql
long_query_time 值的 SQL,會被記錄到慢查詢日誌。long_query_time 的默認值是 10s,意思是查詢響應時間超過 10s 的 SQL語句。默數據庫
認狀況下,MySQL 是不開啓慢查詢日誌的,須要咱們手動設置這個參數值,固然,若是不是調優須要的話,通常不建議開啓慢查詢日誌,服務器
由於開啓慢查詢日誌或多或少會帶來必定性能的影響。慢查詢日誌支持將日誌記錄寫入日誌文件,也支持將日誌記錄寫入數據表。性能
慢查詢日誌參數測試
slow_query_log:表示是否開啓慢查詢日誌,OFF表示禁用,ON表示開啓3d
slow_query_log_file:MySQL 慢查詢日誌存儲路徑。能夠不設置該參數,系統會默認給一個缺省值的文件host_name-slow.log日誌
long_query_time:慢查詢時間閾值,默認狀況下值爲 10sblog
log_queries_not_using_indexes:表示不使用索引的查詢超出 long_time_query 的值也會被記錄到日誌中,默認值是 OFF表示禁用索引
log_output:表示存儲慢查詢日誌方式,log_output='FILE' 表示將日誌存入文件,log_output=‘TABLE’ 表示將日誌存入數據表 mysql.slow_log
。MySQL 同時支持兩種日誌存儲方式,配置的時候以逗號分隔開,如:log_output='FILE,TABLE'。通常狀況下建議將日誌記錄到
文件中,若是將日誌記錄到數據表中須要耗費更多系統資源
慢查詢日誌配置
默認狀況下,slow_query_log 是禁用的,能夠經過設置 slow_query_log 的值開啓,以下所示:
開啓慢查詢日誌:
使用 set global slow_query_log=1 開啓慢查詢日誌只對當前數據庫生效,若是 MySQL 重啓後則會失效。若是要永久生效,就須要修改配置文件
my.cnf(Linux 下的叫法),若是是 win 系統通常叫 my.ini,如以下所示:
修改 my.ini 文件,增長或修改參數 slow_query_log 和 slow_query_log_file 後,而後重啓 MySQL 服務器,以下所示:
如今已經開啓了慢查詢日誌,那麼什麼樣的 SQL 纔會被記錄到日誌中呢?這個就由 long_query_time 控制,默認狀況下 long_query_time 的值爲 10s,可
以使用命令修改,也能夠經過修改配置文件修改,對於運行時間恰好等於 long_query_time 的狀況是不會被記錄下來的,以下:
修改 long_query_time 值
執行修改操做以後,須要從新鏈接或打開一個會話才能看到修改的值 或者 使用 show global variable like '%long_query_time%' 查看
咱們來測試一下,在 MySQL 中執行下面 SQL 語句,而後咱們去檢查對應的慢日誌:
log_output 是用來指定存儲日誌的方式,操做以下:
設置慢日誌存儲方式:
執行 select sleep(10); 以下所示:
系統變量 log_queries_not_using_indexes 未使用索引的查詢也會被記錄到慢日誌中,若是調優的話,建議開啓這個選項,開啓這個選項後 index full scan 的sql 也會被記錄到日誌中
這個開啓以後慢查詢日誌可能會增加的很快,能夠設定 log_throttle_queries_not_using_indexes 變量來限制,默認值是 0,也就是不限制,若是該變量
值大於 0 如:log_throttle_queries_not_using_indexes = 100 表示每秒記錄100條不使用索引的 SQL 語句到慢查詢日誌中
默認狀況下,管理類的 SQL 語句也不會被記錄到慢查詢日誌中,log_slow_admin_statements 變量表示是否將管理類的 SQL 語句記錄到慢查詢日中,管理
類的 SQL 語句包含:ALTER TABLE, ANALYZE TABLE, CHECK TABLE, CREATE INDEX, DROP INDEX, OPTIMIZE TABLE, and REPAIR TABLE
MySQL 的從庫默認不記錄慢查詢,若是要開啓從庫的慢查詢須要設定 log_slow_slave_statements
若是要查詢有多少條慢查詢記錄,可使用系統變量,以下: