{eval=Array;=+count(Array);}
關(guān)于數(shù)據(jù)庫分區(qū),分表,分庫,我通俗易懂的來舉幾個栗子,看過還不懂,你打我。。。
村里一家四口人(老爹叫A)有兩兒子(分別是A1,A2),長大了要自己種地了,就嚷嚷著要分家,把村東的一塊地給大兒子A1,村西的給二兒子A2,但是這時候戶口本上記錄的還是一家四口(對外顯示還是一家人),國土局統(tǒng)計村西土地面積的時候直接讓A去匯報,然后A去讓A2測量并匯報,不涉及到A1!
這就是分區(qū):對外只展示一張表,但是表內(nèi)部分區(qū)到不同的磁盤上,只需要其中一部分?jǐn)?shù)據(jù)的時候可直接映射相應(yīng)的區(qū)進(jìn)行查找,避免了全表掃描,提升了查找,插入數(shù)據(jù)的性能,一般是數(shù)據(jù)庫層面實現(xiàn)的,如下圖所示:
分區(qū)可分為水平分區(qū)和垂直分區(qū),通常水平分區(qū)用的比較多,算法有按照某個字段的大小等,某個字段的hash分等等!
啥是分表呢?還是上面那一家子,分家了之后,戶口也變了,變成了三家,國土局讓上報數(shù)據(jù)的時候,需要分別通知三家進(jìn)行,比如只需要村西的統(tǒng)計,那么還是只用找二兒子A2就行了(三家已經(jīng)是多帶帶的數(shù)據(jù)庫表了)
分表:對外展示多張小表,業(yè)務(wù)代碼訪問之前,需要先通過計算分表策略算法,來選擇具體訪問哪一張表,和分區(qū)一樣,避免了全表的訪問,分表如下圖示:
分庫:跟分表有異曲同工之妙,但是分庫的級別為數(shù)據(jù)庫級別(按上面的例子,就得提升到村子級別了),簡單來說就算是你一個庫是關(guān)系型數(shù)據(jù)庫,一個庫是nosql數(shù)據(jù)庫也是可以稱為分庫的,這對于庫的引擎,連接方式都可以有不同的實現(xiàn)!
分庫通常在不同的數(shù)據(jù)庫服務(wù)節(jié)點上,避免單庫宕機(jī)對全部數(shù)據(jù)服務(wù)帶來的影響,同時也提供了更大的數(shù)據(jù)庫并發(fā)能力!
關(guān)于分庫,分表,分區(qū)是不是很簡單?
現(xiàn)在分庫分表使用的更加的廣泛,業(yè)界也提供了大量成熟的數(shù)據(jù)庫中間件來提供分庫分表,比如mycat,sharding-jdbc等等,只需要根據(jù)業(yè)務(wù)選擇合適的分庫分表策略,結(jié)合相應(yīng)組件就能輕松搭建起一個分庫分表數(shù)據(jù)服務(wù),不過隨之而來的全局唯一數(shù)據(jù),統(tǒng)計,連接查詢等才是更加需要關(guān)注的,更多的技術(shù)分享,敬請關(guān)注。。。
數(shù)據(jù)庫分區(qū)一般指的是數(shù)據(jù)庫的表分區(qū),下面我們以MYSQL為例來講解數(shù)據(jù)庫分區(qū),其他數(shù)據(jù)庫道理基本相同。分區(qū)表對用戶來說是一個邏輯整體,但底層mysql將其分離為多個物理子表,分區(qū)對于sql來說是完全封裝的,也就是對我們應(yīng)用來說是透明的,不可見的,但從底層的文件系統(tǒng)來看,一個表被分割為多個子表文件,使用方法也很簡單,在創(chuàng)建表時使用 partition by 子句定義分區(qū)表達(dá)式來存放數(shù)據(jù)。
mysql執(zhí)行查詢時候,優(yōu)化器先根據(jù)分區(qū)表達(dá)式的定義來過濾無用的分區(qū),執(zhí)行sql時只需要查找包含需要的數(shù)據(jù)分區(qū)就可以了。
分區(qū)表管理一組分區(qū)表和管理普通表一樣,各個子表的索引也是上加了一個人完全相同的索引,從存儲引擎來看,子表和一個獨立的普通表沒有任何區(qū)別,以下我們來看看當(dāng)執(zhí)行以下命令的時候mysql如何操作分區(qū)表的:
分區(qū)數(shù)據(jù)顯而易見的好處是數(shù)據(jù)分塊管理,大表拆小表,這樣在操作數(shù)據(jù)的時候可以預(yù)先過濾掉不必要的數(shù)據(jù),盡量控制在一個較小的數(shù)據(jù)區(qū)來查詢數(shù)據(jù)。一個很重要的意見是:盡量在where條件中帶入分區(qū)列查詢,如果沒有mysql就會掃描所有分區(qū),我們可以使用expain patitions 來查看sql語句是否使用了分區(qū)過濾,如:
explain partitions select * from tuser
結(jié)果顯示掃描的所有分區(qū),我們再加上where條件:
explain partitions SELECT * from tuser where cid=2000
結(jié)果顯示只掃描了一個分區(qū)。
數(shù)據(jù)分區(qū)是一種物理數(shù)據(jù)庫的設(shè)計技術(shù),它的目的是為了在特定的SQL操作中減少數(shù)據(jù)讀寫的總量以縮減響應(yīng)時間。要搞清楚數(shù)據(jù)庫分區(qū),先要清楚一下問題
在實際工作中隨著業(yè)務(wù)的增長,我們的數(shù)據(jù)庫數(shù)據(jù)越來越大,隨之而來的是單個表中數(shù)據(jù)太多。以至于查詢速度變慢,而且由于表的鎖機(jī)制導(dǎo)致應(yīng)用操作也受到嚴(yán)重影響,出現(xiàn)了數(shù)據(jù)庫性能瓶頸。
也就是說當(dāng)表中的數(shù)據(jù)量不斷增大,查詢數(shù)據(jù)的速度就會變慢,應(yīng)用程序的性能就會下降,這時就應(yīng)該考慮對表進(jìn)行分區(qū)。表進(jìn)行分區(qū)后,邏輯上表仍然是一張完整的表,只是將表中的數(shù)據(jù)在物理上存放到多個表空間(物理文件上),這樣查詢數(shù)據(jù)時,不至于每次都掃描整張表。為了提高數(shù)據(jù)庫性能,保證數(shù)據(jù)的準(zhǔn)確無誤以及安全性。所以要進(jìn)行分區(qū)。
分區(qū)并不是生成新的數(shù)據(jù)表,而是將表的數(shù)據(jù)均衡分?jǐn)偟讲煌?/strong>硬盤,系統(tǒng)或是不同服務(wù)器存儲介子中,實際上還是一張表。
要實現(xiàn)這一功能,首先要了解數(shù)據(jù)庫對水平分區(qū)表進(jìn)行分區(qū)存儲的原理。
為了方便理解數(shù)據(jù)分區(qū),在這里先介紹一下分表的概念。分表是將一個大表按照一定的規(guī)則分解成多張具有獨立存儲空間的實體表,每個表都對應(yīng)三個文件,MYD數(shù)據(jù)文件,.MYI索引文件,.frm表結(jié)構(gòu)文件。這些表可以分布在同一塊磁盤上,也可以在不同的機(jī)器上。app讀寫的時候根據(jù)事先定義好的規(guī)則得到對應(yīng)的表名,然后去操作它。
數(shù)據(jù)庫分區(qū)和分表相似,都是按照規(guī)則分解表。不同在于分表將大表分解若干個獨立的實體表,而分區(qū)是將數(shù)據(jù)分段劃分在多個位置存放,分區(qū)后,表還是一張表,但數(shù)據(jù)散列到多個位置了。應(yīng)用程序讀寫的時候操作還是表名,DB自動去組織分區(qū)的數(shù)據(jù)。
所謂水平分區(qū)分表,就是把邏輯上的一個表,在物理上按照你指定的規(guī)則分放到不同的文件里,把一個大的數(shù)據(jù)文件拆分為多個小文件,還可以把這些小文件放在不同的磁盤下。這樣把一個大的文件拆分成多個小文件,便于我們對數(shù)據(jù)的管理。
分區(qū)可以做到將表的數(shù)據(jù)均衡到不同的地方,提高數(shù)據(jù)檢索的效率,降低數(shù)據(jù)庫的頻繁IO壓力值,目的是為了在特定的SQL操作中減少數(shù)據(jù)讀寫的總量以縮減響應(yīng)時間。
1、相對于單個文件系統(tǒng)或是硬盤,分區(qū)可以存儲更多的數(shù)據(jù);
2、數(shù)據(jù)管理比較方便,比如要清理或廢棄某年的數(shù)據(jù),就可以直接刪除該日期的分區(qū)數(shù)據(jù)即可;
3、精準(zhǔn)定位分區(qū)查詢數(shù)據(jù),不需要全表掃描查詢,大大提高數(shù)據(jù)檢索效率;
4、可跨多個分區(qū)磁盤查詢,來提高查詢的吞吐量;
5、在涉及聚合函數(shù)查詢時,可以很容易進(jìn)行數(shù)據(jù)的合并;
分區(qū)確實能夠帶數(shù)據(jù)庫性能的提高,運用也是非常廣泛,但同時也有很多要注意的地方。在性能的考量上。并不是說分區(qū)越多,性能就越好。這些分區(qū)都會影響到內(nèi)存的消耗,CPU的繁忙程度。所以你在使用分區(qū)的時候,要找到你的平衡點。還是那句話不用最好的,要用最適合的。看完有幫助的話麻煩點個贊,關(guān)注一下,歡迎留言評論。
0
回答0
回答0
回答0
回答0
回答0
回答0
回答0
回答0
回答0
回答