10個(gè)提升MySQL性能的小技巧
從工作量分析到索引的三條規(guī)則,這些專家見解肯定會(huì)讓您的MySQL服務(wù)器尖叫。
在所有的關(guān)系數(shù)據(jù)庫中,MySQL已經(jīng)被證明了完全是一頭野獸,只要通知停止運(yùn)行就絕對不會(huì)讓你多等一秒鐘,使你的應(yīng)用置于困境之中,你的工作也承受極大的風(fēng)險(xiǎn)。
不過事實(shí)是,普通的錯(cuò)誤都在MySQL性能錯(cuò)誤的射程之內(nèi)。所以為了使你的MySQL服務(wù)器能夠高速運(yùn)轉(zhuǎn),提供穩(wěn)定且持續(xù)的服務(wù),消除這些錯(cuò)誤是非常有必要的,但是這可能常常會(huì)被你的繁忙工作或配置陷阱微妙地遮蔽了。
幸運(yùn)的是,許多MySQL性能問題其實(shí)都有相似的解決辦法,發(fā)現(xiàn)并解決問題,然后你的MySQL用起來就順手多啦。
接下來就和大家分享一下10個(gè)使MySQL性能提升的小技巧。
MySQL性能提升小技巧1:對你的工作進(jìn)行配置想要了解你的服務(wù)器到底如何支配時(shí)間,最好的辦法就是對服務(wù)器的工作進(jìn)行配置。通過配置你的服務(wù)器,你可以expose最昂貴的query來為將來的調(diào)優(yōu)做準(zhǔn)備。從這個(gè)角度,時(shí)間就是最重要的衡量標(biāo)準(zhǔn),因?yàn)楫?dāng)你對你的服務(wù)器發(fā)起一個(gè)query之后,除了它到底多塊的完成之外你不會(huì)關(guān)心任何其他事。
配置你的工作文件的最優(yōu)解就是MySQL Enterprise Monitor的query分析儀或者Percona Toolkit的pt-query-digest。這些工具可以幫助你捕捉你的服務(wù)器正在執(zhí)行的詢問以及返回按響應(yīng)時(shí)間遞減順序排序的任務(wù)表,它還會(huì)持續(xù)不斷地把最昂貴、費(fèi)時(shí)的任務(wù)更新在最上方,這樣你就能知道你的精力應(yīng)該更加集中在什么地方了。
工作文件配置工具會(huì)把相似的詢問分在一個(gè)組,你可以很方便地查看低速運(yùn)行或者是告訴運(yùn)行但是多次進(jìn)行的詢問。
MySQL性能提升小技巧2: 深入理解四個(gè)基本資源一個(gè)數(shù)據(jù)庫服務(wù)器需要以下4種資源才能正常運(yùn)轉(zhuǎn):CPU,內(nèi)存,硬盤以及網(wǎng)絡(luò)。如果這其中任何一種性能不足,運(yùn)轉(zhuǎn)不力或者超負(fù)荷運(yùn)轉(zhuǎn)的話,那么數(shù)據(jù)庫服務(wù)器就非常可能表現(xiàn)不佳。
理解基礎(chǔ)的資源是非常重要是以下兩個(gè)層面:選擇硬件以及疑難問題解答。
當(dāng)為MySQL選擇硬件的時(shí)候,確保所有的組件都表現(xiàn)良好。同樣重要的是把它們進(jìn)行合理的配置。大多是時(shí)候,一些機(jī)構(gòu)會(huì)選擇高轉(zhuǎn)速的CPU以及硬盤,但是他們通常來講內(nèi)存都不夠用。在某些情況下,按照數(shù)量級(jí)增加內(nèi)存是提升性能最廉價(jià)的辦法,尤其是工作負(fù)載是綁定磁盤的情況下。這聽起來可能違反常識(shí),但是在許多情況下,硬盤都是過度使用的,因?yàn)闆]有足夠的內(nèi)存來儲(chǔ)存數(shù)據(jù)工作集。
另外一個(gè)平衡的典范當(dāng)屬CPU。在大多數(shù)情況下,MySQL使用高轉(zhuǎn)速的CPU會(huì)運(yùn)轉(zhuǎn)得很好,因?yàn)槊恳粋€(gè)詢問都是在單線程中運(yùn)行而不能在CPU之間并行。
當(dāng)要解答疑難問題的時(shí)候,請了解清楚所有資源的性能和使用情況,用你審慎的目光來判斷它們到底是本來就性能差勁還是因?yàn)槌休d了過多的任務(wù)。這個(gè)姿勢應(yīng)該能讓你解決問題快一些。
MySQL性能提升小技巧3:別吧MySQL當(dāng)成一個(gè)隊(duì)列使隊(duì)列和隊(duì)列訪問模式可以在你完全沒有察覺的情況下偷偷進(jìn)入你的應(yīng)用。舉個(gè)栗子,如果你設(shè)置了某個(gè)項(xiàng)的狀態(tài),以便某個(gè)特定的工作進(jìn)程在調(diào)用它之前可以聲明它,那么你就在無意中創(chuàng)建了一個(gè)隊(duì)列。把郵件標(biāo)記為未發(fā)送,發(fā)送它們,然后它們被標(biāo)記為已發(fā)送就是一個(gè)很好理解的栗子。
隊(duì)列會(huì)產(chǎn)生問題主要有2個(gè)原因:它們連續(xù)運(yùn)轉(zhuǎn)你工作,防止它們并行,那么這通常就會(huì)產(chǎn)生一個(gè)表格,里面包含了進(jìn)程中的工作還有很久以前已完成工作的歷史數(shù)據(jù)。這不僅會(huì)使你的應(yīng)用產(chǎn)生延遲而且也會(huì)給MySQL增加不必要的負(fù)荷。
MySQL性能提升小技巧4: 花費(fèi)最少的結(jié)果先過濾優(yōu)化MySQL性能最好的辦法就是先完成廉價(jià)、不確定的工作,然后在最小的結(jié)果數(shù)據(jù)集中完成艱難、準(zhǔn)確的工作。
例如你要通過一個(gè)給定的地理位置半徑來找到你想要的東西。在大多數(shù)程序員的工具箱里,他們首先會(huì)想到的一定是計(jì)算球面上的距離的大圓公式(Haversine)。但是用這個(gè)公式的問題在于可能要用到很多三角方面的運(yùn)算,這對CPU的要求是非常高的。大圓的計(jì)算往往運(yùn)行緩慢,使得機(jī)器的CPU使用率飆升。
在你開始應(yīng)用大圓公式之前,在總集當(dāng)中將你的記錄減少成最小的子集,并把結(jié)果集整合成一個(gè)確切的圓。一個(gè)包含圓(確切或不確切的)的正方形是解決這個(gè)問題最簡單的方法。這樣的話,正方形之外的一切都不回碰上這些成本昂貴的三角函數(shù)。
MySQL性能提升小技巧5:了解兩種伸縮性死亡陷阱伸縮性其實(shí)并不像你想象的那樣捉摸不定。實(shí)際上在數(shù)學(xué)當(dāng)中已經(jīng)有非常明確的將伸縮性表示為方程式的定義。這些方程式突出展現(xiàn)了為什么系統(tǒng)并沒有如預(yù)期那樣的良好伸縮。
參見通用可擴(kuò)展法(Universal Scalability Law)—非常清晰地解釋和量化了一個(gè)系統(tǒng)的伸縮性特性。它從兩個(gè)基礎(chǔ)成本方面對伸縮性問題進(jìn)行了闡釋:序列化(serialization)和串?dāng)_(crosstalk)。
多進(jìn)程必須為在伸縮性上具有固有限制的序列化停止工作。相似地,如果多個(gè)進(jìn)程必須時(shí)時(shí)刻刻互相交流才能配合他們的工作的話,他們就是在互相限制。
避免序列化以及串?dāng)_,你的應(yīng)用伸縮性將會(huì)大大提升。那么在對MySQL來說意味著什么呢?因情況而異,但有些示例可以避免對行進(jìn)行排它鎖定。關(guān)于隊(duì)列,參見技巧3,往往會(huì)因?yàn)殛?duì)列伸縮性就變得很差。
MySQL性能提升小技巧6:不要太關(guān)注配置DBA常常耗費(fèi)大量的時(shí)間來調(diào)整配置。換來的結(jié)果有時(shí)卻是傷害而不是大的提升。我看到過許多的最優(yōu)化的服務(wù)器時(shí)不時(shí)就崩潰,內(nèi)存不足,而且在工作負(fù)載稍微多一點(diǎn)的時(shí)候就表現(xiàn)很差。
MySQL上搭載的默認(rèn)配置是一刀切并且嚴(yán)重過時(shí)的,但是它們也不需要完全重新配置。只要把最基礎(chǔ)的設(shè)置正確,有需要的話再做小幅調(diào)整即可。在大多數(shù)情況下,通過正確設(shè)置大約10個(gè)選項(xiàng),你可以獲得服務(wù)器峰值性能的95%。其他無法應(yīng)用此方法的的情況的話應(yīng)該是非常特殊的情況,所以就不用去管他了。
在大多數(shù)情況下,服務(wù)器“轉(zhuǎn)換”工具是不推薦的,因?yàn)樗鼈兂3?huì)有一些在特定情況下并不適用的規(guī)則。有些甚至存在危險(xiǎn)且不準(zhǔn)確編碼—例如緩存命中率和內(nèi)存消耗公式。這些都是不對的,而且隨這時(shí)代的進(jìn)步他們變得更加地不對。
MySQL性能提升小技巧7: 小心分頁詢問分頁應(yīng)用常常會(huì)把服務(wù)器搞癱瘓。在向你展示結(jié)果的頁面當(dāng)中,有翻到下一頁的鏈接,這類應(yīng)用通常不以索引的方式進(jìn)行分類整理,然后他們使用一種 LIMIT和 offset使得服務(wù)器做大量的工作生成,然后丟棄行。
優(yōu)化選項(xiàng)在用戶界面常常自己就能找到。而不是展示確切的頁數(shù)結(jié)果以及每個(gè)頁面的單獨(dú)鏈接,只展示下一列的鏈接就好。你也可以防止大家翻到太后面的頁數(shù)。
從質(zhì)詢方面來看,你可以比你想要的多選取一行,然后當(dāng)你點(diǎn)擊“下一頁”鏈接的時(shí)候,你可以指定最后一行作為下一組結(jié)果的起點(diǎn),而不是使用帶offset的 LIMIT。舉個(gè)栗子,當(dāng)用戶在查看120行中的第101行時(shí),你會(huì)同時(shí)select第121行;為了遞交下一頁,你可以向服務(wù)器詢問第121行或者超過121的行,限定在21。
MySQL性能提升小技巧8: 及時(shí)保存數(shù)據(jù),審慎警告監(jiān)管和預(yù)警是必不可少的,但是典型的監(jiān)控系統(tǒng)到底怎么了?它開始發(fā)送一些錯(cuò)誤的手勢,然后系統(tǒng)管理員就設(shè)置了垃圾郵件過濾規(guī)則來停止這些煩擾。然后很快你的監(jiān)管系統(tǒng)就會(huì)完全癱瘓。
我傾向于從兩個(gè)方面來看待監(jiān)管;獲取指標(biāo)以及發(fā)出預(yù)警。盡可能的獲取并保存指標(biāo)是非常重要的,因?yàn)楫?dāng)你想要知道系統(tǒng)到底改變了什么的時(shí)候你會(huì)很慶幸你當(dāng)初保存了它們。有一天會(huì)突然出現(xiàn)一個(gè)很奇怪的錯(cuò)誤,然后你就會(huì)很高興你有能力指出服務(wù)器的工作負(fù)載中的一段然后展示這個(gè)改變。
相比之下,警告就可能有點(diǎn)多了。人們常常會(huì)對緩存命中率或者短期內(nèi)每秒所創(chuàng)建的表格發(fā)出警告。問題是對這種緩存命中率并沒有一個(gè)合適的閾值。正確的閾值并不是隨著服務(wù)器的不同而變化,而是隨著你工作負(fù)載的不同,每一個(gè)小時(shí)都是不一樣的。
這就導(dǎo)致,警告只能有節(jié)制地并且只能在預(yù)示一個(gè)具體、可操作的問題時(shí)才是可行的。一個(gè)低緩存命中率并不是可操作的問題,而且他也不指向一個(gè)實(shí)在的問題,但對連接嘗試沒有響應(yīng)的服務(wù)器才是真正需要結(jié)局的問題。
MySQL性能提升小技巧9: 學(xué)習(xí)index的三條法則Index可能是數(shù)據(jù)庫匯總最難理解的概念,因?yàn)楹苋菀拙蛯ndex到底如何工作以及服務(wù)器如何使用它們感到困惑。確實(shí)要花些力氣才能真正理解它到底是怎么回事。
Index經(jīng)過適當(dāng)設(shè)計(jì)后,主要在數(shù)據(jù)庫服務(wù)器中提供如下三種服務(wù):
Index讓服務(wù)器查找相鄰行的集合而不是單獨(dú)的行。許多人可能會(huì)認(rèn)為index的作用就是為了查找單獨(dú)的行,但是查找單獨(dú)的行會(huì)導(dǎo)致混亂的硬盤操作,速度就會(huì)變慢。而且查找行的集合要容易多了,所有或者說大多數(shù)都比一次只查找一個(gè)行要有趣多了。
Index通過按照閱讀喜好進(jìn)行排列省去了整理的過程。整理是耗費(fèi)巨大的。按照自己的喜好進(jìn)行閱讀效率也更高。
Index完全滿足了服務(wù)器的詢問,根本就不需要再連接表格。這是眾所周知的覆蓋索引或僅索引查詢。
如果你可以定義自己的索引和詢問來利用這三個(gè)機(jī)會(huì),你就可以使查詢速度快幾個(gè)數(shù)量級(jí)。
MySQL性能提升小技巧10: 利用同行的專業(yè)知識(shí)不要一個(gè)人冒險(xiǎn)。如果你對一個(gè)問題感到煩惱,同時(shí)也在做一些對你來說有邏輯且隔離的解決方式,那很好。這在20次中可能會(huì)有19次是有效的。但是剩下的1次,你可能會(huì)掉進(jìn)兔子洞里,會(huì)非常費(fèi)時(shí)費(fèi)力,這完全是因?yàn)槟悻F(xiàn)在所做的努力只是看起來可能是有意義的。
建立與MySQL相關(guān)的資源網(wǎng)絡(luò),這超越了工具和故障排除指南。有一些非常有知識(shí)的人潛伏在郵件列表、論壇、問答網(wǎng)站上,等等。會(huì)議、展會(huì)和本地用戶團(tuán)體活動(dòng)都提供了寶貴的機(jī)會(huì),讓你能與那些在緊要關(guān)頭幫助你的同行建立聯(lián)系。
如果你們想要找工具對上述的技巧進(jìn)行實(shí)踐,你可以看看 Percona Configuration Wizard for MySQL , Percona Query Advisor for MySQL , 以及 Percona Monitoring Plugins 。(你需要注冊一個(gè)Percona賬號(hào)才可以免費(fèi)進(jìn)入前兩個(gè)鏈接。)配置向?qū)Э蔀樾碌姆?wù)器生成一個(gè)基準(zhǔn)my.cnf文件,這個(gè)文件優(yōu)于服務(wù)器上的樣本文件。Query advisor會(huì)分析你的SQL查詢來檢測潛在的壞模式,如分頁查詢(技巧7)。Percona Monitoring Plugins是一系列的監(jiān)管和圖形繪制插件,它們可以幫助你及時(shí)保存數(shù)據(jù)并且警惕預(yù)警(技巧8)。所有這些工具都是免費(fèi)的哦。
來自:http://www.cocoachina.com/programmer/20170731/20067.html
相關(guān)文章:
1. 恢復(fù)從 Access 2000、 Access 2002 或 Access 2003 中數(shù)據(jù)庫刪除表的方法2. MySQL 字符串函數(shù):字符串截取3. Microsoft Office Access修改代碼字體大小的方法4. MySQL中InnoDB和MyISAM類型的差別5. Mysql入門系列:安排預(yù)防性的維護(hù)MYSQL數(shù)據(jù)庫服務(wù)器6. mysql數(shù)據(jù)存放的位置在哪7. MySQL 8.0 之索引跳躍掃描(Index Skip Scan)8. SQLServer的內(nèi)存管理架構(gòu)詳解9. Mysql 用戶權(quán)限管理實(shí)現(xiàn)10. 在SQL Server中用XQuery分解XML數(shù)據(jù)
