(015)mysql 技巧 * 慢查詢及分析

概述

開啓慢查詢可以記錄到耗時超過設定時間閥值 long_query_time 的語句,默認不開啓。開啓慢查詢日誌會或多或少帶來一定的性能影響,建議僅調試時開啓。

配置

通過 SHOW VARIABLES LIKE 'xxxx' 語句查看配置狀態,如:

SHOW VARIABLES LIKE 'slow_query_log'

主要的配置:

  1. slow_query_log:是否開啓慢查詢日誌,默認 OFF。
  2. long_query_time:慢查詢閾值,當查詢時間多於設定的閾值時,記錄日誌,默認 10s。
  3. slow_query_log_file:慢查詢日誌文件的保存路徑。
  4. 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;

慢查詢日誌記錄:

以上重要參數:

  1. Query_time:執行時長,上例表現爲 15.253022s。
  2. 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 ,索引的作用未免太過分了!

(感覺測試某些步驟出現問題,待再次測試分析)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章