什么是數(shù)據(jù)庫分區(qū)?為什么要使用它?
什么是數(shù)據(jù)庫分區(qū)?
分區(qū)是將表和索引分成較小的部分,甚至將其細分為較小的部分??梢詫⑺胂蟪稍谝粋€大倉庫(一張大桌子)中存放著數(shù)百萬本不同主題和年份(例如2000–2019年)的不同雜志。分區(qū)意味著您將把它們組織在那個大倉庫內(nèi)的不同房間中。它們?nèi)匀粚儆谝粋€倉庫,但是現(xiàn)在您根據(jù)數(shù)據(jù)庫分區(qū)策略在邏輯級別上對它們進行分組。
使用數(shù)據(jù)庫分區(qū)有什么好處?
一個好的分區(qū)策略是可行的,原因有很多,例如更好的性能,更好的可管理性,更高的可用性或負載平衡。
(1) 更好的性能
如果以上面的雜志倉庫為例,您正在尋找2009年10月發(fā)行的“體育畫報”,并且在發(fā)行年份對倉庫進行了分區(qū),則只需查看房間或找到您想要的2009年分區(qū)。現(xiàn)在,想象一下,在倉庫的一個“ 2009”房間內(nèi),您放了幾個大盒子,然后按照主題或出版物將雜志放在這些盒子里(“體育畫報”,“專業(yè)攝影師”,“釣魚”英雄”,…)。這將創(chuàng)建一個子分區(qū),這將使查找所需的雜志變得更加容易,因為您將不再需要瀏覽所有《 2009年》雜志,但是您可以直接進入2009年會議室,然后直接轉(zhuǎn)到“ “體育畫報”框。這就是性能的劃分?,F(xiàn)在,如果您將不同的雜志放在柜子里,而雜志的所有背面(標題和月份/年份)都在外面,那將與添加索引相同。這樣一來,您就可以快速找到正確的雜志并挑選出來,而不必挑選每本雜志并閱讀整本雜志,直到找到所需的雜志為止。而且,如果您需要來自兩個或多個不同分區(qū)(房間,盒子)的數(shù)據(jù)(雜志),則可以讓兩個或多個進程(人員)在尋找它,同時您仍可以確保他們不會兩次查看同一部分。
(2) 更好的可管理性和負載平衡
您可以將不同的邏輯分區(qū)存儲在不同的物理磁盤上,甚至在某些情況下甚至可以存儲在服務器上。這樣,在一個分區(qū)/磁盤/服務器上工作并不一定意味著其他分區(qū)必須脫機。維護也是如此,如果僅保留最近10年的數(shù)據(jù),并且按年范圍對表進行分區(qū),則可以輕松地刪除(或備份和刪除)最早的分區(qū)?;氐絺}庫比較,如果您每年將倉庫劃分為多個房間,并且在2011年房間中完成工作,那么其他所有房間仍然可以使用。如果要刪除2000年的所有雜志,則只需從一個房間中取出所有東西,而不必每年瀏覽每本雜志。
(3) 更高的可用性
由于故障或其他原因造成的停機時間不一定會對其他分區(qū)產(chǎn)生影響。備份和恢復也是如此,您可以對每個分區(qū)進行獨立于其他分區(qū)的操作,從而減少了停機時間。
什么時候應該對我的表進行分區(qū)?
分區(qū)策略中需要考慮以下幾件事:
- 大表始終是一個很好的分區(qū)候選對象,超過2Gb的一切都是一個開始。
- 如果您的表中包含歷史數(shù)據(jù),并且數(shù)據(jù)將按時間順序添加。例如,如果您按月或天為基礎按批次加載數(shù)據(jù),則更是如此。在這種類型的分區(qū)中,一個分區(qū)只能保留最新的分區(qū)可更新,而其他分區(qū)(舊)則是只讀的。
- 如果您需要在不同類型的存儲(在某些情況下甚至是服務器)之間分配表。例如,大多數(shù)查詢都在最近三年的分區(qū)上運行,但是您需要在表中保留10年的數(shù)據(jù)。最古老的7年很少被查詢。這樣,您可以將最新的三個分區(qū)放置在高性能SSD驅(qū)動器上,而將最舊的7個分區(qū)放置在較舊和較便宜但速度較慢的HD驅(qū)動器上。
為什么不使用索引而是分區(qū)?
好吧,索引很好。他們甚至很棒!在您的數(shù)據(jù)庫性能工具箱中,它們絕對是必不可少的工具。但是索引非常擅長檢索一小部分數(shù)據(jù),尤其是散布在整個表中的數(shù)據(jù)。如果索引可以為您提供超過20%的數(shù)據(jù),則可以認為它們最終表現(xiàn)最佳,而真正的轉(zhuǎn)折點大概是數(shù)據(jù)的1%-5%。但是,當然,這很大程度上取決于許多不同的因素,例如服務器,設置,數(shù)據(jù),天氣(不,不是天氣!),……最重要的是:不要考慮分區(qū)或索引。
在一個好的分區(qū)策略中,仍然有很多空間和機會可以很好地使用索引。例如,我上面的雜志倉庫示例,在倉庫內(nèi)部每年進行分區(qū),在房間內(nèi)部按出版物進行分區(qū)。通過使標題/月份在櫥柜而不是框內(nèi)(這將創(chuàng)建索引)更加可見,從而留下了更多提高性能的機會。
我可以基于什么數(shù)據(jù)庫分區(qū)策略?
您在分區(qū)表中輸入的每一行都應明確屬于一個特定分區(qū)。分區(qū)鍵定義行將存儲在哪個分區(qū)中。這個分區(qū)鍵可以是一個字段,也可以包含多個字段的組合,只要它是模棱兩可的,那么就很獨特。回到雜志的例子,您可以使用“出版年份”作為分區(qū)鍵,但是您不能將“包含汽車品牌的圖片”用作每個品牌的分區(qū)鍵和分區(qū),因為這意味著最新的“ Top Gear Magazine”需要同時位于“ Ferrari”和“ Aston Martin”分區(qū)中,并且還有更多。
有哪些不同類型的分區(qū)?
- 范圍分區(qū)
- 列表分區(qū)
- 哈希分區(qū)
- 子分區(qū)
(1) 范圍分區(qū)
按值范圍進行分區(qū)。這意味著,如果分區(qū)鍵的值在該分區(qū)范圍內(nèi),則對表進行分區(qū),以使行屬于特定分區(qū)。例如,雜志:我們每年將倉庫分成多個房間。這意味著我們有范圍分區(qū),其中每個分區(qū)的范圍從01–01-YYYY到31–12-YYYY。因此,如果我有一本雜志的發(fā)布日期為2015年5月,則它將進入2015年5月1日至2015年1月31日至2015年12月31日的范圍分區(qū)。
間隔分區(qū)是范圍分區(qū)的一種特殊類型,其中間隔分區(qū)中的范圍始終基于時間,并且在將新數(shù)據(jù)添加到表中應屬于新間隔范圍的新數(shù)據(jù)時自動創(chuàng)建。
(2) 列表分區(qū)
通過列表對數(shù)據(jù)庫進行分區(qū),可以通過在表和每個分區(qū)的定義中定義分區(qū)鍵來顯式控制和定義哪個值進入哪個分區(qū):
- SQL> Create table magazines (Pub_Title varchar(150), Pub_Date (date)) partition by list(Pub_Title) (partition Pub_Title1 values(“Sports Illustrated”, “Mens Health”), partition Pub_Title2 values(“Vanity”, “Flair”), partition Pub_Title3 values(“Yoga Magazine”, “Zen Magazine”));
或者,以雜志為例,您可能已經(jīng)可以從SQL中讀取信息:我們將倉庫按每個出版物標題劃分為多個房間,但是對于每個不同的出版物標題,我們沒有足夠的房間,因此我們“列出”了每個房間幾個。在第一會議室中,我們放置“體育畫報”和“精神健康”;在第二會議室中,我們放置“虛榮”和“天才”;在第三會議室中,我們放置“瑜伽雜志”和“禪宗雜志”。有道理吧?
(3) 哈希分區(qū)
在哈希分區(qū)中,數(shù)據(jù)行根據(jù)分區(qū)鍵的哈希值映射到分區(qū)。如果要在沒有明確業(yè)務或數(shù)據(jù)邏輯分區(qū)的表上使用分區(qū),并且需要均勻分布的分區(qū),則此功能很有用。例如,您有一個裝滿雜志的整個倉庫,但出版物標題和出版日期是隨機的。沒有完整的年份,依此類推。但是,您希望將它們平均分配到倉庫的十個不同房間中,以便以后需要取回一本(或多本)雜志時,可以同時派出十個人去尋找它們。十個不同的房間。比散列分區(qū)派上用場。例如,您選擇出版物標題和出版物日期的組合作為分區(qū)鍵,然后讓數(shù)據(jù)庫對該鍵進行哈希處理,然后選擇適當?shù)姆謪^(qū),同時將所有雜志平均分配到所有房間。
(4) 子分區(qū)
子分區(qū)(也稱為復合分區(qū))是在分區(qū)內(nèi)部創(chuàng)建分區(qū)。它是已經(jīng)分區(qū)表的每個分區(qū)的進一步劃分。讓我們回到雜志倉庫。我們首先每年將整套雜志放在不同的房間里。這是基于范圍分區(qū)的第一個分區(qū)。接下來,在每個這些年級房間中,放入盒子,然后在每個盒子中放入所有具有相同出版物名稱的雜志。由于在那個房間里,我們只已經(jīng)有一個特定年份的出版物,所以在那個盒子里,我們只會有一個特定出版物名稱和一個特定出版年份的雜志。因此,這非常容易且快速地找到“ Yoga Magazine”,“ 2017年11月版”?;蛘?,在代碼中:
- SQL> Create table magazines (Pub_Title(varchar(150)), Pub_Date(date) Partition by rage (Pub_Year(Pub_Date)) Subpartition by list(Pub_Title) ( partition Pub_Title1 values(“Sports Illustrated”, “Mens Health”), partition Pub_Title2 values(“Vanity”, “Flair”), partition Pub_Title3 values(“Yoga Magazine”, “Zen Magazine”) );
如您所見,分區(qū)是除數(shù)據(jù)庫工具箱中許多其他工具之外的有價值的工具,對于提高數(shù)據(jù)庫性能,可用性和可維護性非常有用。選擇哪種分區(qū)策略當然取決于您的數(shù)據(jù),但也取決于您將要實現(xiàn)的特定數(shù)據(jù)庫系統(tǒng)的技術可能性。





























