資料分割槽是一種物理資料庫的設計技術,它的目的是為了在特定的sql操作中減少資料讀寫的總量以縮減響應時間。
分割槽並不是生成新的資料表,而是將表的資料均衡分攤到不同的硬碟,系統或是不同伺服器儲存介子中,實際上還是一張表。另外,分割槽可以做到將表的資料均衡到不同的地方,提高資料檢索的效率,降低資料庫的頻繁io壓力值,分割槽的優點如下:
相對於單個檔案系統或是硬碟,分割槽可以儲存更多的資料;
資料管理比較方便,比如要清理或廢棄某年的資料,就可以直接刪除該日期的分割槽資料即可;
精準定位分割槽查詢資料,不需要全表掃瞄查詢,大大提高資料檢索效率;
可跨多個分割槽磁碟查詢,來提高查詢的吞吐量;
在涉及聚合函式查詢時,可以很容易進行資料的合併;
水平分割槽
這種形式分割槽是對錶的行進行分割槽,通過這樣的方式不同分組裡面的物理列分割的資料集得以組合,從而進行個體分割(單分割槽)或集體分割(1個或多個分割槽)。所有在表中定義的列在每個資料集中都能找到,所以表的特性依然得以保持。
舉個簡單例子:乙個包含十年發票記錄的表可以被分割槽為十個不同的分割槽,每個分割槽包含的是其中一年的記錄。(朋奕注:這裡具體使用的分割槽方式我們後面再說,可以先說一點,一定要通過某個屬性列來分割,譬如這裡使用的列就是年份)
垂直分割槽
這種分割槽方式一般來說是通過對錶的垂直劃分來減少目標表的寬度,使某些特定的列被劃分到特定的分割槽,每個分割槽都包含了其中的列所對應的行。
舉個簡單例子:乙個包含了大text 和b l ob 列的表,這些text和blob列又不經常被訪問,這時候就要把這些不經常使用的text和blob了劃分到另乙個分割槽,在保證它們資料相關性的同時還能提高訪問速度。
在資料庫**商開始在他們的資料庫引擎中建立分割槽(主要是水平分割槽)時,dba和建模者必須設計好錶的物理分割槽結構,不要儲存冗餘的資料(不同表中同時都包含父表中的資料)或相互聯結成乙個邏輯父物件(通常是檢視)。這種做法會使水平分割槽的大部分功能失效,有時候也會對垂直分割槽產生影響。
1. 分割槽
就是把一張表的資料分成n個區塊,在邏輯上看最終只是一張表,但底層是由n個物理區塊組成的
2. 分表
就是把一張表按一定的規則分解成n個具有獨立儲存空間的實體表。系統讀寫時需要根據定義好的規則得到對應的字表明,然後操作它。
3. 分庫
一旦分表,乙個庫中的表會越來越多
將整個資料庫比作圖書館,一張表就是一本書。當要在一本書中查詢某項內容時,如果不分章節,查詢的效率將會下降。而同理,在資料庫中就是分割槽。
問題描述
什麼時候考慮使用分割槽?
分割槽解決的問題
主要可以提公升查詢效率
分割槽的實現方式(簡單)
mysql5 開始支援分割槽功能
create table sales (
id int auto_increment,
amount double not null,
order_day datetime not null,
primary key(id, order_day)
) engine=innodb
partition by range(year(order_day)) (
partition p_2010 values less than (2010),
partition p_2011 values less than (2011),
partition p_2012 values less than (2012),
partition p_catchall values less than maxvalue);
什麼時候考慮分表?
分表解決的問題
分表後,單錶的併發能力提高了,磁碟i/o效能也提高了,寫操作效率提高了
分表的實現方式(複雜)
需要業務系統配合遷移公升級,工作量較大
分割槽和分表的區別與聯絡
常見分區分表的規則策略(類似)
range(範圍)
hash(雜湊)
按照時間拆分
hash之後按照分表個數取模
在認證庫中儲存資料庫配置,就是建立乙個db,這個db單獨儲存user_id到db的對映關係
什麼時候考慮使用分庫?
分庫解決的問題
其主要目的是為突破單節點資料庫伺服器的 i/o 能力限制,解決資料庫擴充套件性問題。
垂直拆分
將系統中不存在關聯關係或者需要join的表可以放在不同的資料庫不同的伺服器中。
按照業務垂直劃分。比如:可以按照業務分為資金、會員、訂單三個資料庫。
需要解決的問題:跨資料庫的事務、jion查詢等問題。
水平拆分
例如,大部分的站點。資料都是和使用者有關,那麼可以根據使用者,將資料按照使用者水平拆分。
按照規則劃分,一般水平分庫是在垂直分庫之後的。比如每天處理的訂單數量是海量的,可以按照一定的規則水平劃分。需要解決的問題:資料路由、組裝。
讀寫分離
對於時效性不高的資料,可以通過讀寫分離緩解資料庫壓力。需要解決的問題:在業務上區分哪些業務上是允許一定時間延遲的,以及資料同步問題。
思路
垂直分庫-->水平分庫-->讀寫分離
問題
選用第三方的資料庫中介軟體(atlas,mycat,tddl,drds),同時業務系統需要配合資料儲存的公升級。
單庫單錶
單庫單錶是最常見的資料庫設計,例如,有一張使用者(user)表放在資料庫db中,所有的使用者都可以在db庫中的user表中查到。
單庫多表
隨著使用者數量的增加,user表的資料量會越來越大,當資料量達到一定程度的時候對user表的查詢會漸漸的變慢,從而影響整個db的效能。如果使用mysql, 還有乙個更嚴重的問題是,當需要新增一列的時候,mysql會鎖表,期間所有的讀寫操作只能等待。
可以通過某種方式將user進行水平的切分,產生兩個表結構完全一樣的user_0000,user_0001等表,user_0000 + user_0001 + …的資料剛好是乙份完整的資料。
多庫多表
隨著資料量增加也許單台db的儲存空間不夠,隨著查詢量的增加單台資料庫伺服器已經沒辦法支撐。這個時候可以再對資料庫進行水平拆分。
總的來說,優先考慮分割槽。當分割槽不能滿足需求時,開始考慮分表,合理的分表對效率的提公升會優於分割槽。
在分布式儲存系統中,資料需要分散儲存在多台裝置上,資料分片(sharding)就是用來確定資料在多台儲存裝置上分布的技術。資料分片要達到三個目的:
分布均勻,即每台裝置上的資料量要盡可能相近;
負載均衡,即每台裝置上的請求量要盡可能相近;
擴縮容時產生的資料遷移盡可能少。
分片模式是什麼?
資料的切分(sharding)根據其切分規則的型別,可以分為兩種切分模式。
(1)一種是按照不同的表(或者schema)來切分到不同的資料庫(主機)之上,這種切分可以稱之為資料的垂直(縱向)切分
(2)另外一種則是根據表中的資料的邏輯關係,將同乙個表中的資料按照某種條件拆分到多台資料庫(主機)上面,這種切分稱之為資料的水平(橫向)切分。
通常對實際應用來說,並不需要知道中介軟體的存在,業務開發人員只需要知道資料庫的概念,所以資料庫中介軟體可以被看做是乙個或多個資料庫集群構成的邏輯庫。
邏輯表(table):
既然有邏輯庫,那麼就會有邏輯表,分布式資料庫中,對應用來說,讀寫資料的表就是邏輯表。邏輯表,可以是資料切分後,分布在乙個或多個分片庫中,也可以不做資料切分,不分片,只有乙個表構成。
分片表:
是指那些原有的很大資料的表,需要切分到多個資料庫的表,這樣,每個分片都有一部分資料,所有分片構成了完整的資料。 總而言之就是需要進行分片的表。
非分片表:
乙個資料庫中並不是所有的表都很大,某些表是可以不用進行切分的,非分片是相對分片表來說的,就是那些不需要進行資料切分的表。
分片節點(datanode)
資料切分後,乙個大表被分到不同的分片資料庫上面,每個表分片所在的資料庫就是分片節點(datanode)。
節點主機(datahost)
資料切分後,每個分片節點(datanode)不一定都會獨佔一台機器,同一機器上面可以有多個分片資料庫,這樣乙個或多個分片節點(datanode)所在的機器就是節點主機(datahost),為了規避單節點主機併發數限制,盡量將讀寫壓力高的分片節點(datanode)均衡的放在不同的節點主機(datahost)。
分片規則(rule)
前面講了資料切分,乙個大表被分成若干個分片表,就需要一定的規則,這樣按照某種業務規則把資料分到某個分片的規則就是分片規則,資料切分選擇合適的分片規則非常重要,將極大的避免後續資料處理的難度。
``
資料庫分割槽 分庫分表
分割槽表 當表中的資料量不斷增大,查詢資料的速度就會變慢,應用程式的效能就會下降,這時就應該考慮對錶進行分割槽。表進行分割槽後,邏輯上表仍然是一張完整的表,只是將表中的資料在物理上存放到多個表空間 物理檔案上 這樣查詢資料時,不至於每次都掃瞄整張表。分割槽表是由多個相關的底層表實現,這些底層表也是由...
資料庫 分區分表分庫 讀寫分離(二)
其主要目的是為突破單節點資料庫伺服器的 i o 能力限制,解決資料庫擴充套件性問題。將系統中不存在關聯關係或者需要join的表可以放在不同的資料庫不同的伺服器中。按照業務垂直劃分。比如 可以按照業務分為資金 會員 訂單三個資料庫。需要解決的問題 跨資料庫的事務 jion查詢等問題。例如,大部分的站點...
sql server 資料庫分區分表
sql server 資料庫分區分表 作為演示,本文使用的資料庫 sql server 2017 管理工具 sql server management studio 18,建立資料庫mytest,新增test表,test表列為 id和name,具體可以自行建立 sql server 資料庫分區分表具...