垂直拆分
垂直拆分就是要把表按模塊划分到不同
數據庫表中(當然原則還是不破壞第三范式),這種拆分在大型網站的演變過程中是很常見的。當一個網站還在很小的時候,只有小量的人來開發和維護,各模塊和表都在一起,當網站不斷豐富和壯大的時候,也會變成多個子系統來支撐,這時就有按模塊和功能把表划分出來的需求。其實,相對於垂直切分更進一步的是服務化改造,說得簡單就是要把原來強耦合的系統拆分成多個弱耦合的服務,通過服務間的調用來滿足業務需求看,因此表拆出來后要通過服務的形式暴露出去,而不是直接調用不同模塊的表,淘寶在架構不斷演變過程,最重要的一環就是服務化改造,把用戶、交易、店鋪、寶貝這些核心的概念抽取成獨立的服務,也非常有利於進行局部的優化和治理,保障核心模塊的穩定性
垂直拆分:單表大數據量依然存在性能瓶頸
水平拆分
上面談到垂直切分只是把表按模塊划分到不同數據庫,但沒有解決單表大數據量的問題,而水平切分就是要把一個表按照某種規則把數據划分到不同表或數據庫里。例如像計費系統,通過按時間來划分表就比較合適,因為系統都是處理某一時間段的數據。而像SaaS應用,通過按用戶維度來划分數據比較合適,因為用戶與用戶之間的隔離的,一般不存在處理多個用戶數據的情況,簡單的按user_id范圍來水平切分
通俗理解:水平拆分行,行數據拆分到不同表中, 垂直拆分列,表數據拆分到不同表中
垂直與水平聯合切分
由上面可知垂直切分能更清晰化模塊划分,區分治理,水平切分能解決大數據量性能瓶頸問題,因此常常就會把兩者結合使用,這在大型網站里是種常見的策略
案例:
以mysql為例,簡單購物系統暫設涉及如下表:
1.產品表(數據量10w,穩定)
2.訂單表(數據量200w,且有增長趨勢)
3.用戶表 (數據量100w,且有增長趨勢)
以mysql為例講述下水平拆分和垂直拆分,mysql能容忍的數量級在百萬靜態數據可以到千萬
垂直拆分:
解決問題:
表與表之間的io競爭
不解決問題:
單表中數據量增長出現的壓力
方案:
把產品表和用戶表放到一個
server上
訂單表單獨放到一個server上
水平拆分:
解決問題:
單表中數據量增長出現的壓力
不解決問題:
表與表之間的io爭奪
方案:
用戶表通過性別拆分為男用戶表和女用戶表
訂單表通過已完成和完成中拆分為已完成訂單和未完成訂單
產品表 未完成訂單放一個server上
已完成訂單表盒男用戶表放一個server上
女用戶表放一個server上(女的愛購物)