mysql分庫分表

2021-08-07 03:43:40 字數 2067 閱讀 8457

分庫原因

為了解決單台伺服器的效能問題,當單臺資料庫伺服器無法支撐當前的資料量時,就需要根據業務邏輯緊密程度把錶分成幾撮,分別放在不同的資料庫伺服器中以降低單台伺服器的負載。

分庫的目的是降低單台伺服器負載,切分原則是根據業務緊密程度拆分,缺點是跨資料庫無法聯表查詢。

分表原因:

當資料量超大的時候,b-tree索引就無法起作用了。除非是索引覆蓋查詢,否則資料庫伺服器需要根據索引掃瞄的結果回表,查詢所有符合條件的記錄,如果資料量巨大,這將產生大量隨機i/o,隨之,資料庫的響應時間將大到不可接受的程度。另外,索引維護(磁碟空間、i/o操作)的代價也非常高。

分庫分表有垂直切分和水平切分兩種。

1、垂直切分,即將表按照功能模組、關係密切程度劃分出來,部署到不同的庫上。例如,我們會建立定義資料庫workdb、商品資料庫paydb、使用者資料庫userdb、日誌資料庫logdb等,分別用於儲存專案資料定義表、商品定義表、使用者資料表、日誌資料表等。

如userid,name,addr乙個表,為了防止表過大,分成2個表。

userid,name

userid,addr

2、水平切分,當乙個表中的資料量過大時,我們可以把該錶的資料按照某種規則,例如userid雜湊、按性別、按省,進行劃分,然後儲存到多個結構相同的表,和不同的庫上。例如,我們的userdb中的使用者資料表中,每乙個表的資料量都很大,就可以把userdb切分為結構相同的多個userdb:part0db、part1db等,再將userdb上的使用者資料表usertable,切分為很多usertable:usertable0、usertable1等,然後將這些表按照一定的規則儲存到多個userdb上。

3、應該使用哪一種方式來實施資料庫分庫分表,這要看資料庫中資料量的瓶頸所在,並綜合專案的業務型別進行考慮。

如果資料庫是因為表太多而造成海量資料,並且專案的各項業務邏輯劃分清晰、低耦合,那麼規則簡單明瞭、容易實施的垂直切分必是首選。

而如果資料庫中的表並不多,但單錶的資料量很大、或資料熱度很高,這種情況之下就應該選擇水平切分,水平切分比垂直切分要複雜一些,它將原本邏輯上屬於一體的資料進行了物理分割,除了在分割時要對分割的粒度做好評估,考慮資料平均和負載平均,後期也將對專案人員及應用程式產生額外的資料管理負擔。

在現實專案中,往往是這兩種情況兼而有之,這就需要做出權衡,甚至既需要垂直切分,又需要水平切分。我們的遊戲專案便綜合使用了垂直與水平切分,我們首先對資料庫進行垂直切分,然後,再針對一部分表,通常是使用者資料表,進行水平切分。

——–分表、分割槽、分片——–

分表,是業務邏輯上分的。

如userid,name,addr乙個表,為了防止表過大,分成2個表。

userid,name

userid,addr

分割槽,對業務透明,在物理實現上分成多個表,邏輯上還是乙個表。

如orderid,userid,ordertime,…..

ordertime<2015-01-01 #p0

ordertime<2015-04-01 #p1

ordertime<2015-07-01 #p2

ordertime<2015-10-01 #p3

ordertime<2016-01-01 #p4

按照時間分割槽。大部分只查詢最近的訂單資料,那麼大部分只訪問乙個分割槽,比整個錶小多了,資料庫可以更加好的快取,效能也提高了。這個是資料庫分的,應用程式透明,無需修改。

分片,業務透明,在物理實現上分成多個伺服器,不同的分片在不同伺服器上。分割槽可以把表分到不同的硬碟上,但不能分配到不同伺服器上。一台機器的效能是有限制的,用分片可以解決單台伺服器效能不夠,或者成本過高問題。

當分割槽之後,表還是很大,處理不過來,這時候可以用分片。(可用分庫分表實現資料庫分片)

orderid,userid,ordertime,…..

userid%4=0,用分片1

userid%4=1,用分片2

userid%4=2, 用分片3

userid%4=3,用分片4

上面這個就是乙個簡單的分片路由,根據userid選擇分片,即不同的伺服器。

mysql分表分庫實現 MySql分表分庫思路

一.資料庫瓶頸 1.1io瓶頸 第一種 磁碟讀io瓶頸,熱點資料太多,資料庫快取放不下,每次查詢時會產生大量的io 分庫和垂直分表 第二種 網路io瓶頸,請求的資料太多,網路頻寬不夠 分庫 1.2cpu瓶頸 第一種 sql問題,如sql中包含join,group by,order by,非索引字段條...

MySQL範圍分表分庫 mysql 分表分庫策略

唯一id的生成 下面列舉幾種常見的唯一id生成方案,需要滿足兩大核心需求 1.全域性唯一 2趨勢有序 1.用資料庫的auto increment 自增id 來生成,每次通過寫入資料庫一條記錄,利用資料庫id自增的特性獲取唯一,有序的id。優點 使用資料庫原有的功能,相對簡單 能夠保證唯一 能夠保證遞...

mysql 分庫分表實戰 MySQL分庫分表實戰

為什麼要分庫分表 在大型 中,當使用者量以及使用者產生的業務資料量達到單庫單錶效能極限時,為了支撐業務可持續發展,對於重要的核心業務必然要進行分庫分表來儲存業務資料。對於非核心業務產生的大量資料,例如爬蟲爬取的資訊,論壇產生的資料等,可以考慮把資料儲存在像mongodb這樣的nosql儲存裡面,這些...