mysql分庫 分表

2022-01-13 02:04:01 字數 2156 閱讀 8840

傳統的分庫分表

傳統的分庫分表都是通過應用層邏輯實現的,對於資料庫層面來說,都是普通的表和庫。

分庫分庫的原因

首先,在單台資料庫伺服器效能足夠的情況下,分庫對於資料庫效能是沒有影響的。在資料庫儲存上,database只起到乙個namespace的作用。database中的表檔案儲存在乙個以database名命名的資料夾中。比如下面的employees資料庫:

mysql> show tables in employees;

+---------------------+

| tables_in_employees |

+---------------------+

| departments         |

| dept_emp            |

| dept_manager        |

| employees           |

| salaries            |

| titles              |

+---------------------+

在作業系統中看是這樣的:

ls /usr/local/var/mysql/employees

db.opt dept_emp.frm dept_manager.ibd salaries.frm titles.ibd

departments.frm dept_emp.ibd employees.frm salaries.ibd

departments.ibd dept_manager.frm employees.ibd titles.frm

database不是檔案,只起到namespace的作用,所以mysql對database大小當然也是沒有限制的,而且對裡面的表數量也沒有限制

所以,為什麼要分庫呢?

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

分庫一般考慮的是垂直切分,除非在垂直切分後,資料量仍然多到單台伺服器無法負載,才繼續水平切分。

比如乙個論壇系統的資料庫因當前伺服器效能無法滿足需要進行分庫。先垂直切分,按業務邏輯把使用者相關資料表比如使用者資訊、積分、使用者間私信等放入user資料庫;論壇相關資料表比如板塊,帖子,回覆等放入forum資料庫,兩個資料庫放在不同伺服器上。

拆分後表往往不可能完全無關聯,比如帖子中的發帖人、回覆人這些資訊都在user資料庫中。未拆分前可能一次聯表查詢就能獲取當前帖子的回覆、發帖人、回覆人等所有資訊,拆分後因為跨資料庫無法聯表查詢,只能多次查詢獲得最終資料。

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

分表分表的原因

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

垂直分表

原因:2.受限於作業系統中的檔案大小限制。

水平分表

原因:1.隨著資料量的增大,table行數巨大,查詢的效率越來越低。

2.同樣受限於作業系統中的檔案大小限制,資料量不能無限增加,當到達一定容量時,需要水平切分以降低單錶(檔案)的大小。

切分原則: 增量區間或雜湊或其他業務邏輯。

使用哪種切分方法要根據實際業務邏輯判斷。

比如對錶的訪問多是近期產生的新資料,歷史資料訪問較少,可以考慮根據時間增量把資料按照一定時間段(比如每年)切分。

如果對錶的訪問較均勻,沒有明顯的熱點區域,則可以考慮用範圍(比如每500w乙個表)或普通hash或一致性hash來切分。

全域性主鍵問題:

原本依賴資料庫生成主鍵(比如自增)的表在拆分後需要自己實現主鍵的生成,因為一般拆分規則是建立在主鍵上的,所以在插入新資料時需要確定主鍵後才能找到儲存的表。

實際應用中也已經有了比較成熟的方案。比如對於自增列做主鍵的表,flickr的全域性主鍵生成方案很好的解決了效能和單點問題,具體實現原理可以參考這個帖子。除此之外,還有類似於uuid的全域性主鍵生成方案,比如達達參考的instagram的id生成器。

一致性hash:

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儲存裡面,這些...