Mysql表有近千萬(wàn)數(shù)據(jù),CRUD如何優(yōu)化?
點(diǎn)擊上方"Java后端編程",?右上角選擇“設(shè)為星標(biāo)”
精品技術(shù)文章準(zhǔn)時(shí)送上!
MySQL 數(shù)據(jù)庫(kù)某張表近千萬(wàn)的數(shù)據(jù),CRUD比較慢,如何優(yōu)化?
說(shuō)實(shí)話,這個(gè)數(shù)據(jù)量級(jí), MySQL 單庫(kù)單表支撐起來(lái)完全沒(méi)有問(wèn)題的,所以首先還是考慮數(shù)據(jù)庫(kù)本身的優(yōu)化。

從上圖可以看到,數(shù)據(jù)庫(kù)優(yōu)化通??梢酝ㄟ^(guò)以上幾點(diǎn)來(lái)實(shí)現(xiàn):
硬件升級(jí):也就是花更多的錢(qián),升級(jí)我們數(shù)據(jù)庫(kù)硬件配置,包括 CPU、內(nèi)存、磁盤(pán)、網(wǎng)絡(luò)等等,但是這個(gè)方案成本高,而且不一定能起到非常好的效果。
數(shù)據(jù)庫(kù)配置:修改數(shù)據(jù)庫(kù)的配置,有可能讓我們的 CRUD 操作變得更快,不過(guò)我也不建議大家把經(jīng)歷放在這一點(diǎn)上面;首先,數(shù)據(jù)庫(kù)的配置通常由專(zhuān)業(yè)的 DBA 來(lái)負(fù)責(zé);第二,大部分時(shí)候,默認(rèn)的數(shù)據(jù)庫(kù)配置在大多數(shù)情況下已經(jīng)是最優(yōu)配置了。
對(duì)于開(kāi)發(fā)人員來(lái)說(shuō),我們需要把注意力放在后面三點(diǎn):
數(shù)據(jù)結(jié)構(gòu)的優(yōu)化,也就是表結(jié)構(gòu)的優(yōu)化
數(shù)據(jù)類(lèi)型的選擇:選用合適的數(shù)據(jù)結(jié)構(gòu)。什么叫做"合適的數(shù)據(jù)結(jié)構(gòu)",比如性別字段,M表示男F表示女,那么一個(gè) char(1) 就足夠了,如果存儲(chǔ)人的年齡,那么就沒(méi)有必要使用 INT 這么大范圍的字段了;
適當(dāng)?shù)牟鸱郑呵f(wàn)不要試圖把所有的字段放在一張表中,因?yàn)檫@會(huì)非常影響性能,通常一張表的字段最好不要超過(guò) 30 個(gè);
適當(dāng)?shù)娜哂啵喝绻恍┏S玫淖侄危赡軙?huì)用在不同的維度,那么我們可以把這些字段設(shè)計(jì)在多張表中,因?yàn)檫@樣可能會(huì)減少表關(guān)聯(lián);
字段盡量設(shè)置成 not Null,盡量帶有默認(rèn)值。
SQL 語(yǔ)句的優(yōu)化
優(yōu)化 SQL 語(yǔ)句執(zhí)行速度的方法有很多,比如:
盡量使用索引,盡量避免全表掃描,提高查詢(xún)速度;
當(dāng)然你不能無(wú)限制地建立索引;維護(hù)索引也會(huì)影響性能,會(huì)降低 DML 操作的速度;
注意 SQL 語(yǔ)句的書(shū)寫(xiě),有一些錯(cuò)誤的寫(xiě)法可能會(huì)導(dǎo)致索引失效;
盡量避免在 where 子句中對(duì)字段進(jìn)行 Null 值判斷(當(dāng)然我們?cè)诒碓O(shè)計(jì)中,直接建議不要有 Null);
條件值多的情況下,盡量不要使用 in 和 not in ;
select 的時(shí)候,使用具體的字段代替 * 號(hào)
避免返回大量數(shù)據(jù),增加分頁(yè);
減少數(shù)據(jù)庫(kù)的訪問(wèn)
我們可以通過(guò)增加本地緩存或分布式緩存的方式,將熱點(diǎn)數(shù)據(jù)存儲(chǔ)到緩存中,以減少數(shù)據(jù)庫(kù)的訪問(wèn);
終極大招,如果是一個(gè)不合理的需求,我們可以拒絕做這個(gè)需求,這樣也算是"減少了數(shù)據(jù)庫(kù)訪問(wèn)"。

說(shuō)完了 MySQL 本身的優(yōu)化,如果數(shù)據(jù)量進(jìn)一步增大的話,我們還有什么優(yōu)化的方案呢?
讀寫(xiě)分離
主庫(kù)用于寫(xiě),從庫(kù)用于讀,將讀寫(xiě)分散在不同的數(shù)據(jù)庫(kù)上,利用多臺(tái)機(jī)器的資源,來(lái)提高數(shù)據(jù)庫(kù)的可用性和性能。

分庫(kù)分表
如果數(shù)據(jù)持續(xù)增多,超過(guò)了單臺(tái) MySQL 的支撐上限,那么只能用【分庫(kù)分表】這一招了;我們可以采用一定的路由規(guī)則,將數(shù)據(jù)保存到不同的數(shù)據(jù)庫(kù)中。
當(dāng)然,如果不是“迫不得已”,我是不太建議分庫(kù)分表的,因?yàn)檫@樣極大地增加了系統(tǒng)的復(fù)雜程度,并且會(huì)帶來(lái)更多的問(wèn)題需要開(kāi)發(fā)人員解決。

以上就是常用的 MySQL 優(yōu)化方案,如果是千萬(wàn)級(jí)數(shù)據(jù)量,優(yōu)化 MySQL 本身即可。
推薦閱讀:
最近面試BAT,整理一份面試資料《Java面試BAT通關(guān)手冊(cè)》,覆蓋了Java核心技術(shù)、JVM、Java并發(fā)、SSM、微服務(wù)、數(shù)據(jù)庫(kù)、數(shù)據(jù)結(jié)構(gòu)等等。
獲取方式:點(diǎn)“在看”,關(guān)注公眾號(hào)并回復(fù)?666?領(lǐng)取,更多內(nèi)容陸續(xù)奉上。
明天見(jiàn)(??ω??)??
