要有高性能的MySQL服務,不僅需要設計好的庫表結構、好的索引,還需要有好的查詢。
也就是說,一個慢查詢的出現,可以從服務器、庫表結構、索引、查詢語句等方面着手。
對查詢進行性能剖析有兩種方式,一種是剖析服務器負載,另一種是剖析單條查詢。
1.剖析服務器負載
1.1捕獲慢查詢
使用慢查詢日志。慢查詢日志是開銷最低、精度最高的測量查詢時間的工具,而且I/O開銷可以忽略不計。
但如果長期開啟慢查詢日志,應部署好日志輪轉(log rotation)工具。或者只在收集負載樣本的期間開啟。
MySQL還有一種查詢日志,叫通用日志,在查詢請求到服務器時進行記錄。
1.2分析查詢日志
使用pt-query-digest可以從慢查詢日志生成剖析報告。確定需要優化的查詢后,可以利用生成的報告迅速的檢查查詢的執行情況。
2.剖析單條查詢
實際應用中有三個方法:SHOW SATUS, SHOW PROFILE, 檢查慢查詢日志的條目。
2.1 使用 SHOW PROFILE
當一條查詢提交給服務器時,此工具會記錄剖析信息到一張臨時表,並且給查詢賦予一個從1開始的整數標識符。
剖析報告會給出查詢執行的每個步驟及其花費的時間。
2.2 使用SHOW STATUS
SHOW STATUS 返回了一些計數器,既有服務器級別的全局服務器,也有基於某個連接的會話級別的計數器。可以顯示某些活動如讀索引的頻繁程度,但無法給出消耗了多少時間。用於猜測哪些操作操作代價較高或者消耗的時間較多。
2.3使用慢查詢日志
包含了 SHOW PROFILE 和 SHOW STATUS 所有的輸出,還有更多信息。
2.4 使用Performance Schema
3.使用性能剖析
慢查詢日志中記錄到有查詢異常慢的問題,可能是系統中有其他東西消耗了資源,也可能是某種類型的鎖或者爭用阻塞了查詢的進度。
4.診斷間歇性問題
一些可能的情況:
1.從運行得很慢得外部服務來獲取數據
2.緩存中的一些重要條目過期,導致大量請求落到MySQL以重新生成緩存條目。
3.DNS查詢偶爾會有超時現象
4,由於互斥鎖爭用或內部刪除緩存算法的效率太低時,MySQL查詢緩存有時導致服務由短暫的停頓
判斷是單條查詢問題還是服務器問題
