一個資料庫伺服器高iowait的最佳化案例
1.開發回饋某一測試環境sql運作緩慢,而在其他測試環境該sql運作很快。兩個環境其配置相同,均只部署了mysql伺服器。
2.執行top指令發現sql運作緩慢的機器上磁碟iowait較sql運作較快的機器高出很多。推測這是導致sql運作緩慢的主要原因,因為該sql是要讀取表,表較大,且要掃描的行數較多。
3.到底是什麼導致機器iowait高呢,執行iotop發現消耗io的進程主要是mysql,而且主要是mysql上的讀取操作。
4.想必是有其他高頻運行的查詢語句不停從某大表中查詢數據,且查詢時可能使用不到索引,要掃描的表行數較多,從而導致高頻io操作,致使其他需io操作的sql運作緩慢。
5.究竟是什麼sql引起的呢?開啟了general log,發現收集到的語句太多,不能很好定位到高開銷的sql。
6.開啟slow log,long_query_time置為1,來擷取慢查詢,同時使用pt-ioprofile用來追蹤mysql資料檔中哪些檔案上的io消耗比較多。
7.綜合slow log(可使用pt-query-digest進行聚合)和pt-ioprofile的結果發現確實是兩個典型的需要掃描全表的且對應的表非常大的sql頻繁執行導致了磁碟的高io。
8.那麼剩下的問題就是優化表格或查詢了。最簡單直接的是透過建立合適的索引來提升查詢效能,減少表掃描行數,需要繼續榨取效能的話就是優化sql的寫法,調整表結構,調整參數配置來解決了。
9.先從收益最大的方法入手,先評估sql語句,根據語句中的條件查看各個字段的數據分佈情況,通過explain等評估在字段上創建索引或多列聯合索引的合理性,並創建合適的索引。
10.最後發現建好索引後原來需要掃全表的語句通過索引可有效減少掃描行數,繼而io操作減少了,伺服器的iowait講題,原來反饋的運行較慢的sql運行速度得以提升,但仍不夠理想。
11.最後透過在該慢語句對應的表建索引,並修正where條件中使用錯誤的值類型極大的提升了sql語句運行速度,且伺服器整體IO消耗大大降低。
12.可透過pt-query-digest聚合優化後mysql server產生的slow log以及使用pt-ioprofile分析優化後mysql資料檔io佔用情況,可了解到優化前後的差異。
以上是MYSQL資料庫伺服器高iowait如何最佳化的詳細內容。更多資訊請關注PHP中文網其他相關文章!