為什麼要分庫分表

2021-10-16 12:04:02 字數 2516 閱讀 1818

初學者在看到這個問題的時候,可能首先想到的是 mysql 一張表到底能存放多少條資料?

根據 mysql 官方文件的介紹,mysql 理論上限是232(受限於32位軟體)條資料,然而實際操作中,往往還受限於下面兩條因素:

myisamdatapointersize,mysql 的 myisamdatapointersize 一般預設是 6,即 48 位,那麼對應的行數就是 248-1。

表的儲存大小 256tb

那有人會說,只要我的資料大小不超過上限,資料行數也不超過上限,是不是就沒有問題了?其實不盡然。

在實際專案中,一般沒有哪個專案真的觸發到 mysql 資料的上限了,因為當資料量變大了之後,查詢速度會慢的嚇人,而一般這個時候,你的資料量離 mysql 的理論上限還遠著呢!

傳統的企業應用一般資料量都不大,資料也都比較容易處理,但是在網際網路專案中,上千萬、上億的資料量並不鮮見。在這種時候,還要保證資料庫的操作效率,我們就不得不考慮資料庫的分庫分表了。

那麼接下來就和大家簡單聊一聊資料庫分庫分表的問題。

看這個名字就知道,就是把乙個資料庫切分成 n 多個資料庫,然後存放在不同的資料庫例項上面,這樣做有兩個好處:

降低單台資料庫例項的負載

可以方便的實現對資料庫的擴容

一般來說,資料庫的切分有兩種不同的切分規則:

接下來我們就對這兩種不同的切分規則分別進行介紹。

先來一張簡單的示意圖,大家感受一下什麼是水平切分:

假設我的 db 中有 table-1、table-2 以及 table-3 三張表,水平切分就是拿著我的絕世好劍,對準黑色的線條,砍一劍或者砍 n 劍!

砍完之後,將砍掉的部分放到另外乙個資料庫例項中,變成下面這樣:

這樣,原本放在乙個 db 中的 table 現在放在兩個 db 中了,觀察之後我們發現:

兩個 db 中表的個數都是完整的,就是原來 db 中有幾張表,現在還是幾張。

每張表中的資料是不完整的,資料被拆分到了不同的 db 中去了。

這就是資料庫的水平切分,也可以理解為按照資料行進行切分,即按照表中某個欄位的某種規則來將表資料分散到多個庫之中,每個表中包含一部分資料。

按照日期劃分:不容日期的資料存放到不同的資料庫中。

對 id 取模:對錶中的 id 字段進行取模運算,根據取模結果將資料儲存到不同的例項中。

使用一致性雜湊演算法進行切分。

所謂的垂直切分就是拿著我的屠龍刀,對準了黑色的線條砍。砍完之後,將不同的表放到不同的資料庫例項中去,變成下面這個樣子:

這個時候我們發現如下幾個特點:

每乙個資料庫例項中的表的數量都是不完整的。

每乙個資料庫例項中表的資料是完整的。

這就是垂直切分。一般來說,垂直切分我們可以按照業務來劃分,不同業務的表放到不同的資料庫例項中。

老實說,在實際專案中,資料庫垂直切分並不是一件容易的事,因為表之間往往存在著複雜的跨庫 join 問題,那麼這個時候如何取捨,就要考驗架構師的水平了!

通過上面的介紹,相信大家對於水平切分和垂直切分已經有所了解,優缺點其實也很明顯了,松哥再來和大家總結一下。

優點水平切分最大的優勢在於資料庫的擴充套件性好,提前選好切分規則,資料庫後期可以非常方便的進行擴容。

有效提高了資料庫穩定性和系統的負載能力。拆分規則抽象好, join 操作基本可以資料庫做。

缺點水平切分後,分片事務一致性不容易解決。

拆分規則不易抽象,對架構師水平要求很高。

跨庫 join 效能較差。

優點一般按照業務拆分,拆分後業務清晰,可以結合微服務一起食用。

系統之間整合或擴充套件相對要容易很多。

資料維護相對簡單。

缺點最大的問題在於存在單庫效能瓶頸,資料表擴充套件不易。

跨庫 join 不易。

事務處理複雜。

雖然 mysql 中資料儲存的理論上限比較高,但是在實際開發中我們不會等到資料存不下的時候才去考慮分庫分表問題,因為在那之前,你就會明顯的感覺到資料庫的各項效能在下降,就要開始考慮分庫分表了。

好了,今天主要是向大家介紹一點概念性的東西,算是我們分布式資料庫中介軟體正式出場前的一點鋪墊。

mysql為什麼要分庫分表?

1 基本思想之什麼是分庫分表?從字面上簡單理解,就是把原本儲存於乙個庫的資料分塊儲存到多個庫上,把原本儲存於乙個表的資料分塊儲存到多個表上。2 基本思想之為什麼要分庫分表?單錶運算元據量有最優值,mysql為1000萬左右 可以減輕資料庫的壓力,不用所有執行緒都查同乙個資料庫 資料庫中的資料量不一定...

我們為什麼要分庫分表

本文 當一張表的資料達到幾千萬時,查詢一次所花的時間會變長。這時候,如果有聯合查詢的話,可能會卡死在那兒,甚至把系統給拖垮。而分庫分表的目的就在於此 減小資料庫的負擔,提高資料庫的效率,縮短查詢時間。另外,因為分庫分表這種改造是可控的,底層還是基於rdbms,因此整個資料庫的運維體系以及相關基礎設施...

資料庫為什麼要分庫分表

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