1,水平分表: 一條記錄一條記錄切斷分出來!
2, 垂直分表: 把常用的 ,不常用的,字段很長的拆出來!
目前很多互聯網系統都存在單表數據量過大的問題,這就降低了查詢速度,影響了客戶體驗。為了提高查詢速度,我們可以優化sql語句,優化表結構和索引,不過度那些百萬級,千萬級的數據庫表,即便優化過后,查詢速度還是滿足不了要求。這時候我們就可以通過分表降低單次查詢數據量,從而提高查詢速度,一般分表的方式有2種:水平拆分和垂直拆分,倆者各有利弊,適用於不同的情況。
水平拆分是指數據表行的拆分,表的行數超過了200萬時,就會變慢,這時候可以把一張表的數據拆成多張表來存放。
通常情況下,我們使用取模的方式來進行表的拆分。比如一張有400萬的用戶表users,為提高其查詢效率我們把其分成4張表user1,user2,user3,user4
通過ID 取模的方式把數據分散到四張表內Id %4+1=[1,2,3,4];
然后查詢,更新,刪除也是通過取模的方式來查詢。
例:QQ的登錄表。假設QQ的用戶有100億,如果只有一張表,每個用戶登錄的時候數據庫都要從這100億中查找,會很慢很慢。如果將這一張表分成100份,每張表有1億條,就小了很多,比如qq0,qq1,qq1…qq99表。
用戶登錄的時候,可以將用戶的id0,那么會得到0-99的數,查詢表的時候,將表名qq和取模的數連接起來,就構建了表名。比如:123456789用戶,取模的89,那么就得到qq89表查詢,查詢的時間將會大大縮短。
另外部分業務邏輯也可以通過地區,年份等字段來進行歸檔拆分,進行拆分后的表,只滿足部分查詢的高效查詢需求。這時候就要在產品策划上,從界面上約束用戶查詢行為,比如,我們是按年來進行歸檔拆分的,這個時候在頁面設計上就約束用戶必須要選擇年,然后才能進行查詢
水平拆分的優點:
表關聯基本能夠在數據庫端全部完成;
不會存在某些超大型數據量和高負載的表遇到瓶頸的問題;
應用程序端整體架構改動相對較少;
事物處理相對簡單
只要切分規則能定義好,基本上較難遇到擴展性限制;
水平切分的缺點:
切分規則相對更為復雜,很難抽象出一個能滿足整個數據庫的切分規則;
后期數據的維護難度有所增加,人為手工定位數據更為困難;
應用系統各模塊耦合度較高,可能會對后面數據的遷移拆分造成一定的困難。
垂直拆分
垂直拆分是指表數據列的拆分,把一張列比較多的表拆分成多張表。表的記錄並不多,但是字段卻很長,表占用空間很大,檢索表的時候需要執行大量的IO,嚴重降低了性能。這時候需要把大的字段拆分到另外一個表,並且該表與原表是一對一的關系。
通常我們按照以下規則進行垂直拆分:
1,把不常用的字段單獨放在一個表;
2,把text,blob等大字段拆分出來放在附表中;
3,經常組合查詢的列放在一張表中;
如果我們只想查詢id為8的學生的分數:select 分數 from tt where id = 8;雖然知識查詢分數,但是題目和回答這兩個大字段也是要被掃描的,很消耗性能。但是我們只關心分數,並不想查詢題目和回答。這就可以使用垂直分割。我們可以把題目單獨放到一張表中,通過id與tt表建立一對一的關系,同樣將回答單獨放到一張表中。這樣我們插敘tt中的分數的時候就不會掃描題目和回答了
垂直切分的優點
數據庫的拆分簡單明了,拆分規則明確
應用程序模塊清晰明確,整合容易
數據維護方便易行,容易定位
垂直切分的缺點
部分表關聯無法再數據庫級別完成,需要在程序中完成
對於訪問極其頻繁且數據量超大的表仍然存在性能瓶頸,不一定滿足需求;
事務處理相對更為復雜;
切分達到一定程度后。擴展性會遇到限制
過度切分可能會帶來系統過度復雜而難以維護;
