分庫分表的那些事


前言

在互聯網公司中,上至大廠,下到普通的公司企業,隨着業務的發展,數據量的日積月累,對於數據庫和表的設計和優化,顯得尤為重要。其中關於分表分庫的問題,在實際場景或者是面試中,亦是老生常談。當我們明白了來龍去脈時,也就沒那么復雜。

為什么需要分庫分表

最為直接便是機器性能的問題。性能的考慮都來源於數據量。當數據量大的時候,隨着而來便是高性能,可拓展,穩定性。當是業務剛開始,數據量小,為了控制成本,單機器是足夠用的。但是隨着業務的發展。在單台機器中無論是CPU、IO等資源,都是極為有限的。正所謂人多勢眾,雙拳難敵四手,都是圍繞強調不要孤軍作戰。所以,分表分庫,亦或是讀寫分離都是為了更好的提高性能,提供更為穩定的服務。對於分表分庫。主要是圍繞這垂直和水平的二種拆分相結合的方式。

垂直拆分

1、庫的垂直拆分:

庫的垂直拆分主要是針對系統的一些數據量較為大的業務進行分解。如常見業務的:用戶數據(注冊,登錄的信息等),商品信息,訂單等等,這些相對而言數據量和讀寫次數都是較多的。最好是進行分庫,部署在不同的機器上面,突破單機器的限制。

2、表的垂直拆分:

也就是針對表的字段進行拆分,將一個大表拆分為多個小表,也就是數據庫中的范式原則。也可以將字段按屬性或使用頻繁程度分類,拆分為多個表,比如一個主要的信息表和一個拓展信息表等等

只采用垂直拆分的話,依舊會存在單表數據量過大的問題。所以需要結合水平拆分的方法。

水平拆分

1、只水平分表

針對數據量巨大的單張表(比如用戶表,訂單表),按照某種規則(RANGE,HASH取模等),切分到多張表里面去,可以有效的解決了單一表數據量過大的問題。 但是這些表還是在同一個庫中,所以庫級別的數據庫操作還是有IO瓶頸。例如:

原本一千萬的user表數據,可以拆分為(user_1,user_2,user_3,user_4)這樣的話,數據就分攤到不同的表中

2、水平分庫分表

將單張表的數據切分到多個服務器上去,每個服務器具有相應的庫與表,只是表中數據集合不同。 水平分庫分表能夠有效的緩解單機和單庫的性能瓶頸和壓力,突破IO、連接數、硬件資源等的瓶頸。但是隨着而來的事務也就成了分布式事務了,聯合查詢的效率也會下降。

常見水平分表拆分手段

1、RANGE:從0到100一個表,101到200一個表;
2、HASH取模:用戶注冊的時候,可以根據用戶的名稱,會在用戶的id 進行hash取模,分配到不同的表上
3、時間維度:比如用戶的登錄記錄信息,可以安裝年+月的結構分攤數據,如 login_202107、login_202103

分庫分表產品

如果不想自己實現分表分庫的的問題,現在市場上也有一些比較成熟的產品可以使用,如360的(Atlas)、阿里的(TDDL)

共同進步,學習分享

覺得寫的還不錯的就點個贊,加個關注唄!持續更新 !!! 點關注,不迷路,小楊帶你上高速

已經為大家整理好了,點擊下面鏈接就可以進入

幾百本各類技術電子書和5T資料資源、最新的面試題

注公眾號【寫代碼的小楊】回復【資料】無套路領取,也歡迎大家一起來討論學習,共同進步


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM