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