要有高性能的MySQL服務,不只須要設計好的庫表結構、好的索引,還須要有好的查詢。算法
也就是說,一個慢查詢的出現,能夠從服務器、庫表結構、索引、查詢語句等方面着手。緩存
對查詢進行性能剖析有兩種方式,一種是剖析服務器負載,另外一種是剖析單條查詢。服務器
1.剖析服務器負載工具
1.1捕獲慢查詢性能
使用慢查詢日誌。慢查詢日誌是開銷最低、精度最高的測量查詢時間的工具,並且I/O開銷能夠忽略不計。優化
但若是長期開啓慢查詢日誌,應部署好日誌輪轉(log rotation)工具。或者只在收集負載樣本的期間開啓。設計
MySQL還有一種查詢日誌,叫通用日誌,在查詢請求到服務器時進行記錄。日誌
1.2分析查詢日誌orm
使用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查詢緩存有時致使服務由短暫的停頓
判斷是單條查詢問題仍是服務器問題