分析MySQL語句查詢性能的方法除了使用 EXPLAIN 輸出執行計劃,還可以讓MySQL記錄下查詢超過指定時間的語句,我們將超過指定時間的SQL語句查詢稱爲“慢查詢”。
對於有效率問題的SQL語句(“慢查詢”),MySQL通過慢查詢日誌進行監控。
SHOW VARIABLES LIKE ‘slow_query_log’;
查看慢查詢日誌是否開啓:
SHOW VARIABLES LIKE ‘%log%’;
查看關於日誌的所有屬性:
SET GLOBAL log_queries_not_using_indexes = ON;
設置全局變量,沒用到索引的查詢也要記錄:
SHOW VARIABLES LIKE ‘long_query_time’;
查看超過多長時間的查詢會被記錄到慢查詢日誌中:
SET GLOBAL slow_query_log = ON;
開啓慢查詢日誌:
SET GLOBAL long_query_time = 0;
設置慢查詢日誌記錄時間爲0秒,即全部查詢都記錄:
SHOW VARIABLES LIKE ‘slow%’;
查看慢查詢日誌所在位置:
查看全局變量是否設置成功(新開一個客戶端):
查看慢查詢日誌內容:
# Time: 160715 15:00:30
# User@Host: root[root] @ localhost [127.0.0.1] Id: 1
# Query_time: 0.000000 Lock_time: 0.000000 Rows_sent: 109 Rows_examined: 109
use sakila;
SET timestamp=1468566030;
SELECT * FROM country;
分析:
查詢用戶爲:root[root] @ localhost [127.0.0.1](User@Host)
查詢花費時間:0.000000秒(Query_time)
鎖定時間:0.000000秒(Lock_time)
返回記錄行數:109(Rows_sent)
檢索行數:109(Rows_examined)
查詢語句:SELECT * FROM country;
總結:
慢查詢日誌實時記錄查詢的相關信息,有利於及時發現開發過程中效率低下的SQL語句,及時進行優化!
磁盤IO相關:
- Rows_examined代表檢索的行數,其值一定程度上與磁盤的IO程度有關。IO即讀寫。試想,如果某個SQL操作需要(聯合)查詢的行數Rows_examined很大很大(從磁盤中讀出數據至MySQL服務器內存中進行SQL條件判斷),意味着磁盤的讀出操作比較繁忙,IO程度大。
- 若磁盤IO過大,很容易形成IO阻塞,導致系統瓶頸。數據庫文件存儲在硬盤中,硬盤的讀寫速度遠遠落後於CPU與內存(硬盤是磁盤的一種,磁盤還包括軟盤,磁盤是通過磁性進行讀寫功能的設備,斷電後保存的文件不會丟失。內存也可以儲存信息,但存儲的載體和磁盤不同,斷電後就不能保存數據。)
- 內存是電腦的數據存儲設備之一,其特點爲容量較小,但數據傳送速度較快,用以彌補硬盤雖然容量大但傳送速度慢的缺點。在電腦中,內存被架設在硬盤和高速緩存器(容量比內存更小同時速度比內存更快的存儲器,架設在內存和CPU之間)之間,從而可以充分發揮CPU的運算能力,不至於使CPU的高速運算能力因數據提取速度過慢而浪費,所以,電腦的運行速度是由CPU,高速緩存器以及內存等存儲設備共同決定的。
- 硬盤是電腦中用來存放暫時不用的信息(包括系統文件)的數據存儲設備,特點是存儲容量大,但數據傳送速度慢。硬盤上的信息永遠是暫時不用的,如果用,要先裝入內存!