資料庫分割槽 分庫分表

2022-03-09 16:19:23 字數 1969 閱讀 4818

分割槽表: 

當表中的資料量不斷增大,查詢資料的速度就會變慢,應用程式的效能就會下降,這時就應該考慮對錶進行分割槽。表進行分割槽後,邏輯上表仍然是一張完整的表,只是將表中的資料在物理上存放到多個表空間(物理檔案上),這樣查詢資料時,不至於每次都掃瞄整張表。

分割槽表是由多個相關的底層表實現,這些底層表也是由控制代碼物件表示,所以我們也可以直接訪問各個分割槽,儲存引擎管理分割槽的各個底層表和管理普通表一樣(所有的底層表都必須使用相同的儲存引擎),分割槽表的索引只是在各個底層表上各自加上乙個相同的索引,從儲存引擎的角度來看,底層表和乙個普通表沒有任何不同,儲存引擎也無須知道這是乙個普通表還是乙個分割槽表的一部分。

事實上,這個方案也不錯,它對使用者遮蔽了sharding的細節,即使查詢條件沒有sharding column,它也能正常工作(只是這時候效能一般)。不過它的缺點很明顯:很多的資源都受到單機的限制,例如連線數,網路吞吐等!雖然每個分割槽可以獨立儲存,但是分割槽表的總入口還是乙個mysql示例。從而導致它的併發能力非常一般,遠遠達不到網際網路高併發的要求!

至於網上提到的一些其他缺點比如:無法使用外來鍵,不支援全文索引。我認為這都不算缺點,21世紀的專案如果還是使用外來鍵和資料庫的全文索引,我都懶得吐槽了!

所以,如果使用分割槽表,你的業務應該具備如下兩個特點:

資料不是海量(分割槽數有限,儲存能力就有限);

併發能力要求不高;

什麼時候使用分割槽表: 

1、表的大小超過2gb。 

2、表中包含歷史資料,新的資料被增加都新的分割槽中。 

有一定知名度的分庫分表中介軟體:

這麼多的分庫分表中介軟體全部可以歸結為兩大型別:

client模式代表有阿里的tddl,開源社群的sharding-jdbc(sharding-jdbc的3.x版本即sharding-sphere已經支援了proxy模式)。架構如下:

但是,無論是client模式,還是proxy模式。幾個核心的步驟是一樣的:sql解析,重寫,路由,執行,結果歸併

分布式全域性唯一id

在很多中小專案中,我們往往直接使用資料庫自增特性來生成主鍵id,這樣確實比較簡單。而在分庫分表的環境中,資料分布在不同的分片上,不能再借助資料庫自增長特性直接生成,否則會造成不同分片上的資料表主鍵會重複。簡單介紹下使用和了解過的幾種id生成演算法。

1. twitter的snowflake(又名「雪花演算法」)

2. uuid/guid(一般應用程式和資料庫均支援)

3. mongodb objectid(類似uuid的方式)

4. ticket server(資料庫生存方式,flickr採用的就是這種方式) 

分布式全域性唯一id生成策略

zookeeper生成全域性id

分片欄位該如何選擇

在開始分片之前,我們首先要確定分片字段(也可稱為「片鍵」)。很多常見的例子和場景中是採用id或者時間字段進行拆分。這也並不絕對的,我的建議是結合實際業務,通過對系統中執行的sql語句進行統計分析,選擇出需要分片的那個表中最頻繁被使用,或者最重要的字段來作為分片字段。

常見分片規則:連續分片、隨機分片

當需要使用分片字段進行範圍查詢時,連續分片可以快速定位分片進行高效查詢,大多數情況下可以有效避免跨分片查詢的問題。後期如果想對整個分片集群擴容時,只需要新增節點即可,無需對其他分片的資料進行遷移。但是,連續分片也有可能存在資料熱點的問題,就像圖中按時間字段分片的例子,有些節點可能會被頻繁查詢壓力較大,熱資料節點就成為了整個集群的瓶頸。而有些節點可能存的是歷史資料,很少需要被查詢到。

隨機分片其實並不是隨機的,也遵循一定規則。通常,我們會採用hash取模的方式進行分片拆分,所以有些時候也被稱為離散分片。隨機分片的資料相對比較均勻,不容易出現熱點和併發訪問的瓶頸。但是,後期分片集群擴容起來需要遷移舊的資料。使用一致性hash演算法能夠很大程度的避免這個問題,所以很多中介軟體的分片集群都會採用一致性hash演算法。離散分片也很容易面臨跨分片查詢的複雜問題。

資料庫分割槽 分表 分庫 分片

資料分割槽是一種物理資料庫的設計技術,它的目的是為了在特定的sql操作中減少資料讀寫的總量以縮減響應時間。分割槽並不是生成新的資料表,而是將表的資料均衡分攤到不同的硬碟,系統或是不同伺服器儲存介子中,實際上還是一張表。另外,分割槽可以做到將表的資料均衡到不同的地方,提高資料檢索的效率,降低資料庫的頻...

資料庫 分區分表分庫 讀寫分離(二)

其主要目的是為突破單節點資料庫伺服器的 i o 能力限制,解決資料庫擴充套件性問題。將系統中不存在關聯關係或者需要join的表可以放在不同的資料庫不同的伺服器中。按照業務垂直劃分。比如 可以按照業務分為資金 會員 訂單三個資料庫。需要解決的問題 跨資料庫的事務 jion查詢等問題。例如,大部分的站點...

資料庫分庫分表

1 基本思想之什麼是分庫分表?從字面上簡單理解,就是把原本儲存於乙個庫的資料分塊儲存到多個庫上,把原本儲存於乙個表的資料分塊儲存到多個表上。2 基本思想之為什麼要分庫分表?資料庫中的資料量不一定是可控的,在未進行分庫分表的情況下,隨著時間和業務的發展,庫中的表會越來越多,表中的資料量也會越來越大,相...