概述
開啓慢查詢可以記錄到耗時超過設定時間閥值 long_query_time 的語句,默認不開啓。開啓慢查詢日誌會或多或少帶來一定的性能影響,建議僅調試時開啓。
配置
通過 SHOW VARIABLES LIKE 'xxxx' 語句查看配置狀態,如:
SHOW VARIABLES LIKE 'slow_query_log'
主要的配置:
- slow_query_log:是否開啓慢查詢日誌,默認 OFF。
- long_query_time:慢查詢閾值,當查詢時間多於設定的閾值時,記錄日誌,默認 10s。
- slow_query_log_file:慢查詢日誌文件的保存路徑。
- log_queries_not_using_indexes:是否將爲使用索引的語句記錄的慢查詢日誌,默認 OFF。
開啓
臨時開啓(重啓失效):
mysql> set global slow_query_log=1;
mysql> set global slow_query_log_file='D:\mysql-slow-query.log';
mysql> set global long_query_time=2;
永久開啓(修改配置,重啓生效):
# 在配置文件 [mysqld]下添加
slow_query_log=1;
slow_query_log_file=D:\mysql-slow-query.log;
long_query_time=2
慢查詢語句
在千萬級用戶表中使用 join 語句,耗時15.25s:
SELECT u.id,username,c.coins FROM `users` u LEFT JOIN `test_user_coins` c ON u.id = user_id LIMIT 10;
慢查詢日誌記錄:
以上重要參數:
- Query_time:執行時長,上例表現爲 15.253022s。
- rows_examined:掃描的總行數,上例表現爲 14201。
分析
在查詢語句前加上 DESC 或 explain 可得到分析結果:
語句:
DESC SELECT u.id,username,c.coins FROM `users` u LEFT JOIN `test_user_coins` c ON u.id = user_id WHERE u.id < 10000 LIMIT 10;
結果:
分析:
關聯表(test_user_coins)未使用索引,初步優化方案,給關聯外鍵 (user_id)添加索引,結果如下:
耗時僅 0.001s ,索引的作用未免太過分了!
(感覺測試某些步驟出現問題,待再次測試分析)