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 次的執行結果。
分析步驟
-
是否支援
-
開啟功能,預設關閉
show variables like 'profiling'; # 檢視 set profiling=on; # 開啟
-
執行 SQL
-
檢視結果:
show profiles;
-
診斷 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 | 交換次數相關開銷 | -
注意
- 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';