垂直拆分:
垂直拆分是根據數據庫里面的數據表的業務進行拆分,比如:一個數據庫里面既存在用戶數據,又存在訂單數據,那么垂直拆分可以把用戶數據放入到用戶庫,把訂單數據放到訂單庫。垂直分表是對數據表進行垂直拆分的一種方式,常見是把一個多字段的大表按常用字段和非常用字段進行拆分,每個表里面的數據記錄數一般情況下是相同的,只是字段不一樣,使用主鍵關聯。
比如原始用戶表是:
垂直拆分后的表是:
垂直拆分的優點是:
1. 可以使得數據變小,一個數據塊(block)就能存放更多的數據,在查詢時就會減少I/O次數(每次查詢時讀取的Block就少)
2. 可以達到最大化利用Cache的目的,具體在垂直拆分的時候可以將不常變的字段放一起,將經常改變的放一起
3. 數據維護簡單
缺點是:
1. 主鍵出現冗余,需要管理冗余例
2. 會引起表連接JOIN操作(增加CPU開銷)可以通過在業務服務器上進行join來減少數據庫壓力
3. 依然存在單表數據量過大的問題(需要水平拆分)
4. 事務處理復雜
水平拆分
概述
水平拆分是通過某種策略將數據分片來存儲,分庫內分表和分庫兩部分,每片數據會分散到不同的MySQL表或庫,達到分布式的效果,能夠支持非常大的數據量。前面的表分區本質上也是一種特殊的庫內分表
庫內分表,僅僅是單純的解決了單一表數據過大的問題,由於沒有把表的數據分布到不同的機器上,因此對於減輕MySQL服務器的壓力來說,並沒有太大的作用,大家還是競爭同一個物理機上的IO、CPU、網絡,這個就要通過分庫來解決
水平拆分表如下:
實際情況中往往會是垂直拆分和水平拆分的結合,即將Users_A_M和Users_N_Z再拆成Users和UserExtras,這樣一共四張表
水平拆分的優點是:
不存在單庫大數據和高並發的性能瓶頸
應用端改造較少
提高了系統的穩定性和負載能力
缺點是:
分片事務一致性難以解決
跨節點Join性能差,邏輯復雜
數據多次擴展難度跟維護量極大
Mycat垂直切分與水平切分詳細配置請參考博文: