明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺!

MYSQL數(shù)據(jù)庫服務(wù)器高iowait怎么優(yōu)化

[摘要]一個(gè)數(shù)據(jù)庫服務(wù)器高iowait的優(yōu)化案例1.開發(fā)反饋某一測試環(huán)境sql運(yùn)行緩慢,而在其他測試環(huán)境該sql運(yùn)行很快。兩個(gè)環(huán)境其配置相同,均只部署了mysql服務(wù)器。2.執(zhí)行top命令發(fā)現(xiàn)sql運(yùn)行緩慢...
一個(gè)數(shù)據(jù)庫服務(wù)器高iowait的優(yōu)化案例

1.開發(fā)反饋某一測試環(huán)境sql運(yùn)行緩慢,而在其他測試環(huán)境該sql運(yùn)行很快。兩個(gè)環(huán)境其配置相同,均只部署了mysql服務(wù)器。

2.執(zhí)行top命令發(fā)現(xiàn)sql運(yùn)行緩慢的機(jī)器上磁盤iowait較sql運(yùn)行較快的機(jī)器高出很多。推測這是導(dǎo)致sql運(yùn)行緩慢的主因,因?yàn)樵搒ql是要讀取表,表較大,且要掃描的行數(shù)較多。

3.到底是什么導(dǎo)致機(jī)器iowait高呢,執(zhí)行iotop發(fā)現(xiàn)消耗io的進(jìn)程主要是mysql,而且主要是mysql上的讀操作。

4.想必是有其他高頻運(yùn)行的查詢語句不停從某大表中查詢數(shù)據(jù),且查詢時(shí)可能使用不到索引,要掃描的表行數(shù)較多,從而導(dǎo)致高頻io操作,致使其他需io操作的sql運(yùn)行緩慢。

5.究竟是什么sql引起的呢?開啟了general log,發(fā)現(xiàn)收集到的語句太多,且不能很好定位到高開銷的sql。

6.開啟slow log,long_query_time置為1,來捕獲慢查詢,同時(shí)使用pt-ioprofile用來追蹤mysql數(shù)據(jù)文件中哪些文件上的io消耗比較多。

7.綜合slow log(可使用pt-query-digest進(jìn)行聚合)和pt-ioprofile的結(jié)果發(fā)現(xiàn)確實(shí)是兩條典型的需要掃描全表的且對應(yīng)的表非常大的sql頻繁執(zhí)行導(dǎo)致了磁盤的高io。

8.那么剩下的問題便是優(yōu)化表或者查詢了。最簡單直接的是通過建合適的索引來提升查詢性能,減少表掃描行數(shù),需要繼續(xù)榨取性能的話就是優(yōu)化sql的寫法,調(diào)整表結(jié)構(gòu),調(diào)整參數(shù)配置來解決了。

9.先從收益最大的方法入手,先評估sql語句,根據(jù)語句中的條件查看各個(gè)字段的數(shù)據(jù)分布情況,通過explain等評估在字段上創(chuàng)建索引或多列聯(lián)合索引的合理性,并創(chuàng)建合適的索引。

10.最后發(fā)現(xiàn)建好索引后原來需要掃全表的語句通過索引可有效減少掃描行數(shù),繼而io操作減少了,服務(wù)器的iowait講題,原來反饋的運(yùn)行較慢的sql運(yùn)行速度得以提升,但還是不夠理想。

11.最后通過在該慢語句對應(yīng)的表建索引,并修正where條件中使用錯(cuò)誤的值類型極大的提升了sql語句運(yùn)行速度,且服務(wù)器整體IO消耗大大降低。

12.可通過pt-query-digest聚合優(yōu)化后mysql server產(chǎn)生的slow log以及使用pt-ioprofile分析優(yōu)化后mysql數(shù)據(jù)文件io占用情況,可了解到優(yōu)化前后的差異情況。

以上就是MYSQL數(shù)據(jù)庫服務(wù)器高iowait如何優(yōu)化的詳細(xì)內(nèi)容,更多請關(guān)注php中文網(wǎng)其它相關(guān)文章!


學(xué)習(xí)教程快速掌握從入門到精通的SQL知識。