目錄
為什么要分庫分表
垂直分
垂直分庫
垂直分表
垂直切分優缺點
優點
缺點
水平分
水平分庫
水平分表
水平切分優缺點
優點?
缺點
為什么要分庫分表
分庫分表是一種場景解決方案,它的出現是為了解決一些場景問題的
-
單表過大的話,讀請求進來,查數據需要的時間會過長,當一張表的數據達到幾千萬時,查詢一次所花的時間會變長。業界公認MySQL單表容量在?1千萬?以下是最佳狀態,因為這時它的BTREE索引樹高在3~5之間。
-
讀請求過多,單節點IO壓力太大,IO壓力太大會造成什么?可能會造成IO阻塞,造成響應速度變慢。
分庫分表有兩種維度,一種維度是分庫,另一種維度是分表。分的話有兩種分法,一種是水平分,另一種是垂直分。
垂直分
垂直切分又可以分為:?垂直分庫
和垂直分表
。
垂直分庫
就是根據業務耦合性,將關聯度低的不同表存儲在不同的數據庫。做法與大系統拆分為多個小系統類似,按業務分類進行獨立劃分。與"微服務治理"的做法相似,
每個微服務使用單獨的一個數據庫。
一開始我們是單體服務,所以只有一個數據庫,所有的表都在這個庫里。
后來因為業務需求,單體服務變成微服務治理。所以將之前的一個商品庫,拆分成多個數據庫。每個微服務對于一個數據庫。
垂直分表
把一個表的多個字段分別拆成多個表,一般按字段的冷熱拆分,熱字段一個表,冷字段一個表。從而提升了數據庫性能。
一開始商品表中包含商品的所有字段,但是我們發現:
商品詳情和商品屬性字段較長
。商品列表的時候我們是不需要顯示商品詳情和商品屬性信息,只有在點進商品商品的時候才會展示商品詳情信息
。
所以可以考慮把商品詳情和商品屬性單獨切分一張表,提高查詢效率。
垂直切分優缺點
優點
- 解決業務系統層面的耦合,業務清晰?
- 與微服務的治理類似,也能對不同業務的數據進行分級管理、維護、監控、擴展等?
- 高并發場景下,垂直切分一定程度的提升IO、數據庫連接數、單機硬件資源的瓶頸
缺點
- 分庫后無法Join,只能通過接口聚合方式解決,提升了開發的復雜度?
- 分庫后分布式事務處理復雜?
- 依然存在單表數據量過大的問題(需要水平切分)
水平分
當一個應用難以再細粒度的垂直切分或切分后數據量行數巨大,存在單庫讀寫、存儲性能瓶頸,這時候就需要進行水平切分了。
水平切分也可以分為:水平分庫
和水平分表
。
水平分庫
上面雖然已經把商品庫分成3個庫,但是隨著業務的增加一個訂單庫也出現QPS過高,數據庫響應速度來不及,一般mysql單機也就1000左右的QPS,如果超過1000就要考慮分庫。
水平分表
?一般我們一張表的數據不要超過1千萬,如果表數據超過1千萬,并且還在不斷增加數據,那就可以考慮分表。
水平切分優缺點
優點?
- 不存在單庫數據量過大、高并發的性能瓶頸,提升系統穩定性和負載能力
- 應用端改造較小,不需要拆分業務模塊
缺點
- 跨分片的事務一致性難以保證
- 跨庫的Join關聯查詢性能較差?
- 數據多次擴展難度和維護量極大