我們應該深度優化MySQL,還是使用快取?

2022-03-22 09:24:59 字數 1441 閱讀 9194

今天我想對乙個greenfield專案上可以採用的各種效能優化策略作個對比。換言之,該專案沒有之前決策強加給它的各種約束限制,也還沒有被優化過。

具體來說,我想比較的兩種優化策略是優化mysql和快取。提前指出,這些優化是正交的,唯一讓你選擇其中一者而不是另一者的原因是他們都耗費了資源,即開發時間。

優化mysql時,一般會先檢視傳送給mysql的查詢語句,然後執行explain命令。稍加審查後很常見的做法是增加索引或者對模式做一些調整。

1、乙個經過優化的查詢對於所有使用應用的使用者來說都是快速的。因為索引通過對數複雜度的速度來檢索資料(又名分制,正如你搜尋乙個**簿一樣,逐步縮小搜尋範圍),而且隨著資料量的遞增也能維持良好的效能。對乙個未經索引化的查詢的結果做快取隨著資料的增長有時候則可能會表現得更差。隨著資料的增長,那些未命中快取的使用者可能會得到很糟糕的體驗,這樣的應用是不可用的。

2、優化mysql不需要擔心快取失效或者快取資料過期的問題。

3、優化mysql可以簡化技術架構,在開發環境下複製和工作會更加容易。

1、有一些查詢不能光通過索引得到效能上的改善,可能還需要改變模式,在某些情況下這對於一些應用可能會很麻煩。

2、有些模式的更改可能用於反規範化(資料備份)。儘管對於dba來說,這是一項常用的技術,它需要所有權以確保所有的地方都是由應用程式更新,或需要安裝觸發器來保證這種變化。

3、一些優化手段可能是mysql所特有的。也就是說,如果底層軟體被移植到多個資料庫上工作,那麼很難確保除了增加索引外一些更複雜的優化技術可以通用。

這種優化需要人來分析應用的實際情況,然後將處理代價昂貴的部分從mysql中剝離出來用第三方快取替代,比如memcached或redis。

1、快取對於一些mysql自身很難優化的查詢來說會工作地很好,比如大規模的聚合或者分組的查詢。

2、快取對於提高系統的吞吐率來說可能是個不錯的方案。比如對於多人同時訪問應用時響應速度很慢的情況。

3、快取可能更容易構建在另乙個應用之上。比如:你的應用可能是另乙個用mysql儲存資料的軟體包的前端,而要對這個軟體包做任何資料庫方面的改動都非常難。

1、如果資料對外提供多種訪問正規化(例如,在不同的頁面上用不同的形式展示),那麼讓快取過期或者更新可能會很難,同時/或者可能需要容忍已過期的資料。乙個可行的替代方案是設計一套更加精細的快取機制,當然它也有缺點,即多次獲取快取會增加時延。

2、快取乙個產生代價昂貴的物件對於那些未命中快取的使用者(見優化mysql的優勢#1)而言可能會產生潛在的效能差異。一些好的效能實踐表明你應該盡量縮小使用者之間的差異性,而不僅僅是平均化(快取傾向於這麼做)。

3、幼稚的快取實現無力應對一些微妙的漏洞,比如雪崩效應。就在上週我幫助了乙個人,他的資料庫伺服器被多個試圖同時再生同樣快取內容的使用者請求沖垮。正確的策略是引入一定級別的鎖來將快取再生的請求序列化。

一般情況下,我會建議使用者先對mysql進行優化,因為這是我認為開始階段最合適的解決方案。但長期來看,大部分應用都會有一些用例需要一定程度上同時實現以上這些方案。

mysq基礎優化

skip name resolve skip locking skip innodb skip bdb key buffer 1g記憶體推薦設定為256m,2g記憶體推薦設定為512m wait timeout 3或者5 2g記憶體推薦設定為5 max connections 如果訪問量很大可以設定...

我們應該記住的

不要放棄學生時代所學。大概很多人會說 大學裡學的東西,對現在的工作一點幫助都沒有。如果因此就將從前所學拋諸腦後,是很可惜的。人不太可能一輩子都做同乙個工作,持續花心在學生時代所學的學科上,非但不是浪費,在轉職時反而能增加選擇的機會。每個星期給自己乙個新的挑戰。心理學家表示,換穿 式的服裝或改變房屋擺...

我們應該知道了

用所謂的 大學生 標榜自己二十年來的苦讀成績 我們,在ktv裡唱著80塊一場的情與愛 用所謂的 流行 來演繹一場不屬於我們的行為藝術 我們,在網咖裡打著兩塊一小時的暴力與滿足 用遊戲裡的繁華虛無來詮釋我們所追求的虛榮 我們,喝著便宜的大理或者幾百的茅台 打著想成為李白的幌子 用喝酒來忘記現實 這就是...