前言
毫不夸張地說(shuō),無(wú)論我們的后端工程師在哪家公司,呆在哪個(gè)團(tuán)隊(duì),做哪個(gè)系統(tǒng),第一個(gè)頭疼的問(wèn)題絕對(duì)是數(shù)據(jù)庫(kù)的性能。如果我們有一套成熟的方法論,我相信我們可以快速準(zhǔn)確地解決我們每天遇到的80%甚至90%的性能問(wèn)題。
從解決問(wèn)題的角度來(lái)看,我們必須首先了解問(wèn)題的原因;其次,我們必須有一套思考和判斷問(wèn)題的過(guò)程,讓我們合理地選擇解決方案;最后,從許多解決方案中選擇合適的解決方案,找到合適的解決方案的前提是我們對(duì)各種解決方案之間的優(yōu)缺點(diǎn)和場(chǎng)景有足夠的了解。沒(méi)有一個(gè)解決方案是完全通用的,軟件工程也沒(méi)有銀彈。
以下是我工作多年以來(lái)使用的八個(gè)計(jì)劃。結(jié)合我通常學(xué)習(xí)和收集的一些信息,我以系統(tǒng)和全面的方式整理成這篇博客文章。我也希望一些有需要的同行能在工作和成長(zhǎng)中提供一些幫助。
為什么數(shù)據(jù)庫(kù)會(huì)慢?
無(wú)論是關(guān)系數(shù)據(jù)庫(kù)還是 NoSQL,任何存儲(chǔ)系統(tǒng)能的存儲(chǔ)系統(tǒng)主要有三種:
- 時(shí)間復(fù)雜
- 數(shù)據(jù)總量
- 高負(fù)載
有兩個(gè)主要因素決定了搜索時(shí)間的復(fù)雜性:
- 查找算法
- 存儲(chǔ)數(shù)據(jù)結(jié)構(gòu)
無(wú)論是哪種存儲(chǔ),數(shù)據(jù)量越少,自然查詢性能越高。隨著數(shù)據(jù)量的增加,資源的消耗(CPU、磁盤讀寫繁忙),耗時(shí)也會(huì)越來(lái)越高。
從關(guān)系數(shù)據(jù)庫(kù)的角度來(lái)看,索引結(jié)構(gòu)基本固定B Tree,時(shí)間復(fù)雜度是O(log n),存儲(chǔ)結(jié)構(gòu)是行式存儲(chǔ)。因此,我們只能優(yōu)化關(guān)系數(shù)據(jù)庫(kù)的數(shù)據(jù)量。
高負(fù)荷的原因包括高并發(fā)請(qǐng)求、復(fù)雜查詢等CPU、磁盤繁忙,服務(wù)器資源不足會(huì)導(dǎo)致慢查詢等問(wèn)題。
這類問(wèn)題通常通過(guò)集群和數(shù)據(jù)冗余來(lái)分擔(dān)壓力。
應(yīng)該站在哪個(gè)層面思考優(yōu)化?
從上圖可以看出,自上而下有硬件、存儲(chǔ)系統(tǒng)、存儲(chǔ)結(jié)構(gòu)和具體實(shí)現(xiàn)四層。
層與層緊密相連,每層上層為層的載體;因此越往頂層越能決定性能的上限,同時(shí)優(yōu)化的成本也相對(duì)會(huì)比較高,性價(jià)比也隨之越低。
以底層的具體實(shí)現(xiàn)為例,索引優(yōu)化的成本應(yīng)該是最小的??梢哉f(shuō),添加索引后,無(wú)論是 CPU 消耗或響應(yīng)時(shí)間立竿見影。
然而,一個(gè)簡(jiǎn)單的句子,無(wú)論如何優(yōu)化和索引也是有限的,當(dāng)沒(méi)有任何優(yōu)化空間的具體實(shí)現(xiàn)層存儲(chǔ)結(jié)構(gòu),思考是否從物理表設(shè)計(jì)優(yōu)化(如庫(kù)表、壓縮數(shù)據(jù)量等),如果是文檔數(shù)據(jù)庫(kù)必須考慮文檔聚合的結(jié)果。
如果存儲(chǔ)結(jié)構(gòu)的優(yōu)化沒(méi)有效果,我們必須繼續(xù)考慮上次。關(guān)系數(shù)據(jù)庫(kù)是否不適合當(dāng)前的業(yè)務(wù)場(chǎng)景?
如果要更換存儲(chǔ),如何更換 NoSQL?
因此,出于性價(jià)比的優(yōu)先考慮,我們的優(yōu)化理念是具體實(shí)現(xiàn)的。沒(méi)有優(yōu)化的空間。當(dāng)然,如果公司有錢,直接使用鈔票的能力,繞過(guò)前三層,這也是一種方便的應(yīng)急處理方法。
本文不討論頂部和底部的優(yōu)化,主要從存儲(chǔ)結(jié)構(gòu)和存儲(chǔ)系統(tǒng)中間兩層的角度。
總結(jié)八大方案
數(shù)據(jù)庫(kù)優(yōu)化方案有三個(gè)核心本質(zhì):減少數(shù)據(jù)量,用空間換性能,選擇合適的存儲(chǔ)系統(tǒng)。
這也對(duì)應(yīng)了開頭慢解釋的三個(gè)原因:數(shù)據(jù)總量、高負(fù)載、查找的時(shí)間復(fù)雜度。
以下是收入類型的一般解釋:短期收入、低處理成本、緊急響應(yīng),長(zhǎng)期存在技術(shù)債務(wù);長(zhǎng)期收入與短期收入相反,短期處理成本高,但效果可長(zhǎng)期使用,可擴(kuò)展性更好。
靜態(tài)數(shù)據(jù)意味著相對(duì)變化頻率較低,不需要過(guò)多的聯(lián)表,where 過(guò)濾較少。相反,動(dòng)態(tài)數(shù)據(jù)更新頻率高,通過(guò)動(dòng)態(tài)條件篩選過(guò)濾。
減少數(shù)據(jù)量
減少數(shù)據(jù)量