作為一名IT行業(yè)的從業(yè)人員,主要在從事產(chǎn)品研發(fā)及項(xiàng)目管理工作,在項(xiàng)目過(guò)程中,經(jīng)常有優(yōu)化數(shù)據(jù)庫(kù)存儲(chǔ)、架構(gòu)方面的方案,所以我來(lái)探討一下這個(gè)問(wèn)題。
目前經(jīng)常使用的關(guān)系型數(shù)據(jù)庫(kù)如MySQL、SQL Server等,都是以“行”為單位進(jìn)行存儲(chǔ),為了快速檢索,也都采用了B樹或其他索引技術(shù)。
從原理上來(lái)講,表中的數(shù)據(jù)越多,索引樹的范圍越大,磁盤讀取也越多,性能也就越低。
從實(shí)踐角度來(lái)看,一般以百萬(wàn)到千萬(wàn)作為一個(gè)表的存儲(chǔ)量級(jí),超出該范圍之后,性能就會(huì)下降,需要采用其他技術(shù)手段解決。
首先想到的就是能否將讀和寫分離,主數(shù)據(jù)庫(kù)用于寫入,讀數(shù)據(jù)庫(kù)(多個(gè))用于對(duì)外提供查詢,通過(guò)數(shù)據(jù)復(fù)制的方式將主數(shù)據(jù)庫(kù)的數(shù)據(jù)同步到讀庫(kù)。該架構(gòu)提升了數(shù)據(jù)庫(kù)的讀寫能力,但對(duì)于主數(shù)據(jù)庫(kù)的寫入能力依然沒(méi)法擴(kuò)展。
其次,垂直分表就是把一個(gè)數(shù)據(jù)量很大的表,可以按某個(gè)字段的屬性或使用頻繁程度分類,拆分為多個(gè)表。如有多種業(yè)務(wù)類型,每種業(yè)務(wù)類型建立不同的表,tb1,tb2,tb3。如果日常業(yè)務(wù)不需要使用所有數(shù)據(jù),可以按時(shí)間分表,比如說(shuō)月表。每個(gè)表只存一個(gè)月的記錄。
再次,水平分表就是根據(jù)一列或多列數(shù)據(jù)的值把數(shù)據(jù)行放到多個(gè)獨(dú)立的表里,這里不具備業(yè)務(wù)意義。如按照id分表,末尾是0-9的數(shù)據(jù)分別插入到10個(gè)表里面。
這樣做的好處就是解決了數(shù)據(jù)存儲(chǔ)容量的問(wèn)題,但也帶來(lái)了諸多弊端,不再一一闡述。
mysql優(yōu)化的方式有很多,選擇上主要還是要考慮個(gè)人的實(shí)際情況,如代碼不可控的情況下,就不適合選擇按字段屬性分表的情況,這樣可能會(huì)帶來(lái)大量的重構(gòu)以及很多不可預(yù)期的風(fēng)險(xiǎn)。
而架構(gòu)的優(yōu)化,雖然對(duì)應(yīng)用是透明的,但對(duì)sql的寫法有很多局限性,比如說(shuō)不能使用聚合函數(shù)等等,同時(shí)也需要有充足的硬件資源,只有一臺(tái)服務(wù)器的情況下是沒(méi)有意義的。
相比起來(lái),代價(jià)最低的是按時(shí)間分表或分區(qū),這兩種辦法對(duì)應(yīng)用來(lái)說(shuō)都是透明的。分區(qū)只需要一次本地?cái)?shù)據(jù)遷移的操作。而通過(guò)分表把現(xiàn)網(wǎng)數(shù)據(jù)和歷史數(shù)據(jù)分離,唯一的代價(jià)是定期的數(shù)據(jù)維護(hù)。
一般如果表里面有1億數(shù)據(jù)的情況下,索引的問(wèn)題應(yīng)該是常識(shí)了,這方面我就不說(shuō)了。