前言:說到優化mysql,總會有這么個回答:水平拆分,垂直拆分,那么我們就來說說什么是水平拆分,垂直拆分。
一、垂直拆分
說明:一個數據庫由很多表的構成,每個表對應着不同的業務,垂直切分是指按照業務將表進行分類,分布到不同的數據庫上面,這樣也就將數據或者說壓力分擔到不同的庫上面。
解釋:專庫專用
優點:
1、拆分后業務清晰,拆分規則明確。
2、系統之間整合或擴展容易。
3、數據維護簡單。
缺點:
1、部分業務表無法join,只能通過接口方式解決,提高了系統復雜度。
2、受每種業務不同的限制存在單庫性能瓶頸,不易數據擴展跟性能提高。
3、事務處理復雜。
結構圖
二、水平拆分
說明:垂直拆分后遇到單機瓶頸,可以使用水平拆分。相對於垂直拆分的區別是:垂直拆分是把不同的表拆到不同的數據庫中,而水平拆分是把同一個表拆到不同的數據庫中。
解釋:相對於垂直拆分,水平拆分不是將表的數據做分類,而是按照某個字段的某種規則來分散到多個庫之中,每個表中包含一部分數據。
簡單來說,我們可以將數據的水平切分理解為是按照數據行的切分,就是將表中 的某些行切分到一個數據庫,而另外的某些行又切分到其他的數據庫中,主要有分表,分庫兩種模式:
優點:
1. 不存在單庫大數據,高並發的性能瓶頸。
2. 對應用透明,應用端改造較少。
3. 按照合理拆分規則拆分,join操作基本避免跨庫。
4. 提高了系統的穩定性跟負載能力。
缺點:
1. 拆分規則難以抽象。
2. 分片事務一致性難以解決。
3. 數據多次擴展難度跟維護量極大。
4. 跨庫join性能較差。
拆分方案:
范圍、枚舉、時間、取模、哈希、指定等
分庫結構圖
分表結構圖
三、2種方式的共同缺點
1. 引入分布式事務的問題。(關於跨庫事務,在設計的時候就應該避免這樣的問題,不過也有解決方案,如MySQL自帶的XA事務(效率很低),java的JTA)
2. 跨節點Join 的問題。(分開查,設計的時候就應該允許部分數據冗余)
3. 跨節點合並排序分頁問題。(同上)
四、總結
1、不管是垂直還是水平切分,盡量不拆分。
2、如果非要拆分,先垂直,后水平。
3、垂直拆分解決表與表之間的io競爭。
4、水平拆分解決單表中數據量增長出現的壓力。
以上就是對垂直拆分和水平拆分的一些學習,歡迎補充和討論。
對於不是很理解的人,可以看看下面的參考鏈接