溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

數(shù)據(jù)庫(kù)優(yōu)化解決海量數(shù)據(jù)

發(fā)布時(shí)間:2021-06-23 14:54:38 來(lái)源:億速云 閱讀:331 作者:chen 欄目:大數(shù)據(jù)

本篇內(nèi)容主要講解“數(shù)據(jù)庫(kù)優(yōu)化解決海量數(shù)據(jù)”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“數(shù)據(jù)庫(kù)優(yōu)化解決海量數(shù)據(jù)”吧!

(一)分離活躍數(shù)據(jù)

       有些數(shù)據(jù)總數(shù)據(jù)量很大,但是活躍數(shù)據(jù)并不多。比如用戶,注冊(cè)用戶很多,但是活躍用戶數(shù)很少。這時(shí)可以將活躍數(shù)據(jù)與不活躍數(shù)據(jù)分離?;钴S數(shù)據(jù)單獨(dú)存放在活躍表中,并通過(guò)離線任務(wù),定時(shí)地將活躍表中的變?yōu)椴换钴S的數(shù)據(jù)遷移出去。查詢時(shí)先從活躍表中查詢數(shù)據(jù),如果查詢不到,再?gòu)姆腔钴S表中查詢數(shù)據(jù)。這樣可以提高查找效率。

(二)讀寫(xiě)分離

        讀寫(xiě)分離的本質(zhì)是對(duì)數(shù)據(jù)庫(kù)進(jìn)行集群,將對(duì)數(shù)據(jù)庫(kù)的操作從單臺(tái)數(shù)據(jù)庫(kù)服務(wù)器分散到多個(gè)數(shù)據(jù)庫(kù)服務(wù)器去處理,從而降低單臺(tái)服務(wù)器的壓力??紤]到集群中所有服務(wù)器存儲(chǔ)的數(shù)據(jù)必須保持一致,一般采用一主多從的設(shè)計(jì)架構(gòu),主服務(wù)器用于數(shù)據(jù)寫(xiě)入,多個(gè)從服務(wù)器用于數(shù)據(jù)讀取,從而在高并發(fā)請(qǐng)求的場(chǎng)景下分散了讀壓力。主服務(wù)器向從服務(wù)器同步數(shù)據(jù)時(shí),如果從服務(wù)器數(shù)量較多,可以讓主服務(wù)器先向其中一部分從服務(wù)器同步數(shù)據(jù),第一部分從服務(wù)器接收到數(shù)據(jù)后再向另外一部分同步。

(三)批量讀取和延遲修改

        批量讀取和延遲修改是通過(guò)減少操作的次數(shù)來(lái)提高效率。單個(gè)上游請(qǐng)求中的多條數(shù)據(jù)查詢可以合并為一條批量查詢,或者對(duì)于一段時(shí)間內(nèi)的多個(gè)請(qǐng)求的數(shù)據(jù)查詢合并為一次數(shù)據(jù)查詢。 延遲修改主要針對(duì)高并發(fā)且頻繁修改的數(shù)據(jù),可以現(xiàn)將修改的結(jié)果暫時(shí)保存在緩存中,然后定時(shí)將緩存中的數(shù)據(jù)保存到數(shù)據(jù)庫(kù)中。程序在讀取數(shù)據(jù)時(shí)可以同時(shí)讀取數(shù)據(jù)庫(kù)和緩存中的數(shù)據(jù)。但這會(huì)帶來(lái)短暫的數(shù)據(jù)不一致的問(wèn)題,而且當(dāng)緩存發(fā)生故障時(shí),未寫(xiě)入數(shù)據(jù)庫(kù)中的數(shù)據(jù)可能會(huì)丟失。

(四)分布式數(shù)據(jù)庫(kù)

        分布式數(shù)據(jù)庫(kù)是將多個(gè)表存放到不同的數(shù)據(jù)庫(kù)中,然后再存放到不同的服務(wù)器中。這樣在處理請(qǐng)求時(shí),如果需要調(diào)用多個(gè)表,可以讓多臺(tái)服務(wù)器同時(shí)處理,從而提高處理速度。分布式數(shù)據(jù)庫(kù)是用來(lái)解決單個(gè)請(qǐng)求本身就非常復(fù)雜的問(wèn)題,將單個(gè)復(fù)雜的請(qǐng)求分配到多個(gè)服務(wù)器處理。使用分布式后的每個(gè)節(jié)點(diǎn)還可以同時(shí)使用讀寫(xiě)分離,組成多個(gè)節(jié)點(diǎn)群。還可以將不同業(yè)務(wù)的數(shù)據(jù)表保存到不同的節(jié)點(diǎn),讓不同的業(yè)務(wù)調(diào)用不同的數(shù)據(jù)庫(kù)。使用分布式數(shù)據(jù)庫(kù)會(huì)面臨數(shù)據(jù)一致性的問(wèn)題和多表查詢的問(wèn)題。

(五)數(shù)據(jù)庫(kù)優(yōu)化 

      數(shù)據(jù)庫(kù)優(yōu)化主要包括:表結(jié)構(gòu)優(yōu)化、索引優(yōu)化、SQL語(yǔ)句優(yōu)化、分區(qū)分表、使用存儲(chǔ)過(guò)程。

      表結(jié)構(gòu)優(yōu)化:大表拆分為多個(gè)子表,查詢相關(guān)度高的字段存放在一個(gè)表中,冗余部分業(yè)務(wù)數(shù)據(jù);

      索引優(yōu)化:索引的本質(zhì)就是在數(shù)據(jù)發(fā)生變化時(shí),按照預(yù)先指定的字段排列順序,保存到一個(gè)類(lèi)似于表的結(jié)構(gòu)中,按索引字段查詢時(shí),即可通過(guò)該結(jié)構(gòu)獲取數(shù)據(jù)記錄的指針并從數(shù)據(jù)表中獲取記錄。使用索引進(jìn)行掃描,其效率高于全表掃描。但是要注意索引使用的是否合理,索引是否帶來(lái)明顯的效率提升,多個(gè)索引共存時(shí),一次查詢到底使用了哪個(gè)索引。索引太多會(huì)不會(huì)影響存儲(chǔ)引擎優(yōu)化查詢的效率,索引太多會(huì)不會(huì)影響數(shù)據(jù)的更新效率,使用聚簇索引時(shí),索引中包含的數(shù)據(jù)量是否會(huì)過(guò)大,導(dǎo)致緩存放不下而要訪問(wèn)磁盤(pán)。

      SQL語(yǔ)句優(yōu)化:包括語(yǔ)法層面和業(yè)務(wù)邏輯的優(yōu)化,配合索引和緩存。不要返回所有列的數(shù)據(jù),一次批量查詢也不要返回太多條記錄,因?yàn)椴樵兘Y(jié)果是可以存放在數(shù)據(jù)庫(kù)服務(wù)器的緩存中的。然后就是需要做好監(jiān)控和慢查詢?nèi)罩荆皶r(shí)發(fā)現(xiàn)慢查詢并分析原因。同一條查詢語(yǔ)句對(duì)于不同的查詢條件,其執(zhí)行結(jié)果可能也不一樣。

      分區(qū):將一張表中的數(shù)據(jù)按照一定的規(guī)則分到不同的區(qū)來(lái)保存。比如按時(shí)間劃分。這樣在查詢時(shí),如果數(shù)據(jù)的范圍在同一個(gè)區(qū)內(nèi),就可以只對(duì)一個(gè)區(qū)的數(shù)據(jù)進(jìn)行操作。

      分表:如果一張表中的數(shù)據(jù)可以分為多種不同的類(lèi)型,并且對(duì)不同類(lèi)型的數(shù)據(jù)同時(shí)操作的場(chǎng)景不多時(shí),可以考慮把不同類(lèi)型的數(shù)據(jù)保存在不同的表中?;蛘呖梢詫⒁粋€(gè)大表拆分成多個(gè)小表,從而減小鎖的粒度。比如某個(gè)表的訪問(wèn)頻率很高,某個(gè)寫(xiě)操作只更改個(gè)別列的數(shù)據(jù),而其他未被修改的列可能被別的查詢請(qǐng)求訪問(wèn),這時(shí)就可以通過(guò)分表來(lái)提高查詢效率。分表的問(wèn)題在于如何查找到對(duì)應(yīng)的表,以及查詢完整數(shù)據(jù)的時(shí)候就需要多表操作了。

      使用存儲(chǔ)過(guò)程:存儲(chǔ)過(guò)程只需要編譯一次且可以進(jìn)行一些復(fù)雜的操作。

      PS原因分析:沒(méi)有合理使用索引,索引過(guò)多導(dǎo)致存儲(chǔ)引擎優(yōu)化查詢效率低下、數(shù)據(jù)更新效率低下,查詢太多字段,返回太多記錄,不合理的查詢語(yǔ)句,聯(lián)表查詢,表結(jié)構(gòu)過(guò)于龐大,鎖粒度太粗,高并發(fā)查詢,緩沖擊穿、穿透、雪崩。

(六)NoSQL

      使用關(guān)系型數(shù)據(jù)庫(kù)時(shí),通常需要先定義表的結(jié)構(gòu),有哪些字段,每個(gè)字段的類(lèi)型,且一個(gè)字段只能保存單一的信息,不能保存多層類(lèi)容。NoSql突破了關(guān)系型數(shù)據(jù)庫(kù)的束縛,實(shí)現(xiàn)了數(shù)據(jù)存儲(chǔ)的非結(jié)構(gòu)化,而且通過(guò)多個(gè)塊存儲(chǔ)數(shù)據(jù),提高了數(shù)據(jù)操作的性能。

(七)Hadoop

       在大數(shù)據(jù)場(chǎng)景下,對(duì)數(shù)據(jù)的存儲(chǔ)和處理提供了相應(yīng)的解決方案。其底層結(jié)構(gòu)為分布式加集群,將同一個(gè)數(shù)據(jù)表中的數(shù)據(jù)分成多塊保存在不同的節(jié)點(diǎn)(分布式),且每一塊數(shù)據(jù)都有多個(gè)節(jié)點(diǎn)保存(集群)。任意節(jié)點(diǎn)都沒(méi)有保存一個(gè)完整的數(shù)據(jù)表,但卻保存了多個(gè)數(shù)據(jù)表的數(shù)據(jù)。在處理一次查詢請(qǐng)求時(shí),對(duì)每一塊的數(shù)據(jù)找到對(duì)應(yīng)的節(jié)點(diǎn)進(jìn)行處理,然后將多個(gè)節(jié)點(diǎn)的處理結(jié)果進(jìn)行聚合處理。

(八)緩存和頁(yè)面靜態(tài)化

        減少調(diào)用后端服務(wù)以及訪問(wèn)數(shù)據(jù)庫(kù)的次數(shù)。本地緩存主要使用map,分布式緩存有redis、memcache、Ehcache。主要考慮問(wèn)題是緩存何時(shí)設(shè)置、何時(shí)更新、何時(shí)刪除。如果應(yīng)用程序需要同時(shí)操作緩存和DB,那么緩存和DB的操作順序如何。

到此,相信大家對(duì)“數(shù)據(jù)庫(kù)優(yōu)化解決海量數(shù)據(jù)”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI