1. 程式人生 > 實用技巧 >MYSQL 索引(三)--- SQL日誌分析

MYSQL 索引(三)--- SQL日誌分析

慢查詢日誌

Mysql 的慢查詢日誌是 Myql 提供的一種日誌記錄,用來記錄在 Myql 中響應時間查過閾值的語句,具體指執行時間超過 long_query_time 值的 SQL,則會被記錄在日誌中。long_query_time 預設為 10,單位為秒。

預設情況下,Mysql 資料庫沒有開啟慢查詢日誌,需要我們手動來設定這個引數。如果不是調優需要,不建議開啟慢查詢日誌,多少會影響效能。Mysql 慢查詢日誌支援寫入到檔案。

檢視開啟慢查詢

SHOW VARIABLES LIKE '%slow_query_log%'; # 檢視慢查詢狀態

預設情況:

開啟

set global slow_query_log=1;

如果要永久生效,必須修改配置檔案 my.cnf:

在 [mysqld] 下新增:

slow_query_log = 1

slow_query_log_file=/var/lib/mysql/localhost-slow.log

long_query_time = 3

log_output = FILE
mysql中 判斷大於long_query_time,而非大於等於

SHOW VARIABLES LIKE 'long_query_time%';

set global long_query_time=3; # 修改後需要重新開啟會話或開啟新會話才會生效

mysql日誌分析工具

mysqldumpslow --help

引數 含義
s 按何種方式排序
c 訪問次數
l 鎖定時間
r 返回記錄
t 查詢時間
al 平均鎖定事件
ar 平均返回記錄時間
at 平均查詢時間
t 返回前面多少條的資料
g 後面搭配正則匹配模式,大小寫不敏感
# 得到返回記錄集最多的十個 SQL,/var/lib/mysql/localhost-slow.log 是慢查詢日誌路徑
mysqldumpslow -s r -t 10 /var/lib/mysql/localhost-slow.log

# 得到訪問次數最多的十個 SQL
mysqldumpslow -s c -t 10 /var/lib/mysql/localhost-slow.log

# 得到按照時間排序的前十條裡面包含左連線的查詢語句
mysqldumpslow -s t -t 10 -g "left join" /var/lib/mysql/localhost-slow.log

# 建議在使用這些命令時結合 | 和 more 使用 ,否則有可能爆屏
mysqldumpslow -s r -t 10 "left join" /var/lib/mysql/localhost-slow.log | more

show profile

show profile 是 mysql 提供可以用來分析當前會話中語句執行的資源消耗情況,可以用於 SQL 的調優測量。

預設情況下,引數處於關閉狀態,並儲存最近 15 次的執行結果。

分析步驟

  1. 是否支援

  2. 開啟功能,預設關閉

    show variables like 'profiling'; # 檢視
    
    set profiling=on; # 開啟
    

  3. 執行 SQL

  4. 檢視結果:

    show profiles;
    

  5. 診斷 SQL

    show profile cpu,block io for query 4;
    

    | 引數 | 含義 |
    | - | - |
    | ALL | 所有的開銷資訊 |
    | BLOCK IO | 塊 IO 相關開銷 |
    | CONTEXT SWITCHES | 上下文切換相關開銷 |
    | CPU | CPU相關開銷 |
    | IPC | 傳送和接收相關開銷 |
    | MEMORY | 記憶體相關開銷 |
    | PAGE FAULTS | 頁面錯誤相關開銷 |
    | SOURCE | 顯示和Source_function, Source_file, Source_line 相關開銷 |
    | SWAPS | 交換次數相關開銷 |

  6. 注意

    • converting HEAP to MyISAM 查詢結果太大,記憶體不夠用,往磁碟上搬了
    • Creating tmp table 建立臨時表:拷貝資料到臨時表,用完再刪除
    • Copying to tmp on disk 把記憶體中臨時表複製到磁碟,危險!!!
    • locked

全域性查詢日誌

永遠不要在生產環境開啟此功能。

檔案配置:

# 開啟
general_log =1 1
# 記錄日誌檔案路徑
general_log_file=/path/logfile
#輸出格式
log_output=FILE

引數配置(一次有效):

set global general_log = 1;
set global log_output='TABLE';