MySQL資料庫表如何水平拆分和垂直拆分

2021-08-29 22:55:56 字數 1799 閱讀 8679

目前很多網際網路系統都存在單錶資料量過大的問題,這就降低了查詢速度,影響了客戶體驗。為了提高查詢速度,我們可以優化sql語句,優化表結構和索引,不過對那些百萬級千萬級的資料庫表,即便是優化過後,查詢速度還是滿足不了要求。這時候我們就可以通過分表降低單次查詢資料量,從而提高查詢速度,一般分表的方式有兩種:水平拆分和垂直拆分,兩者各有利弊,適用於不同的情況。

水平拆分 

水平拆分是指資料表行的拆分,表的行數超過200萬行時,就會變慢,這時可以把一張的表的資料拆成多張表來存放。 

通常情況下,我們使用取模的方式來進行表的拆分;比如一張有400w的使用者表users,為提高其查詢效率我們把其分成4張表users1,users2,users3,users4 

通過用id取模的方法把資料分散到四張表內id%4+1 = [1,2,3,4] 

然後查詢,更新,刪除也是通過取模的方法來查詢。

例:qq的登入表。假設qq的使用者有100億,如果只有一張表,每個使用者登入的時候資料庫都要從這100億中查詢,會很慢很慢。如果將這一張表分成100份,每張表有1億條,就小了很多,比如qq0,qq1,qq1…qq99表。

使用者登入的時候,可以將使用者的id%100,那麼會得到0-99的數,查詢表的時候,將表名qq跟取模的數連線起來,就構建了表名。比如123456789使用者,取模的89,那麼就到qq89表查詢,查詢的時間將會大大縮短。

另外部分業務邏輯也可以通過地區,年份等字段來進行歸檔拆分;進行拆分後的表,只能滿足部分查詢的高效查詢需求,這時我們就要在產品策劃上,從介面上約束使用者查詢行為。比如我們是按年來進行歸檔拆分的,這個時候在頁面設計上就約束使用者必須要先選擇年,然後才能進行查詢;在做分析或者統計時,由於是自己人的需求,多點等待其實是沒關係的,並且併發很低,這個時候可以用union把所有表都組合成一張檢視來進行查詢,然後再進行查詢。

水平拆分的優點: 

◆表關聯基本能夠在資料庫端全部完成; 

◆不會存在某些超大型資料量和高負載的表遇到瓶頸的問題; 

◆應用程式端整體架構改動相對較少; 

◆事務處理相對簡單; 

◆只要切分規則能夠定義好,基本上較難遇到擴充套件性限制;

水平切分的缺點: 

◆切分規則相對更為複雜,很難抽象出乙個能夠滿足整個資料庫的切分規則; 

◆後期資料的維護難度有所增加,人為手工定位資料更困難; 

◆應用系統各模組耦合度較高,可能會對後面資料的遷移拆分造成一定的困難。

垂直拆分 

垂直拆分是指資料表列的拆分,把一張列比較多的表拆分為多張表。表的記錄並不多,但是欄位卻很長,表占用空間很大,檢索表的時候需要執行大量的io,嚴重降低了效能。這時需要把大的字段拆分到另乙個表,並且該錶與原表是一對一的關係。 

通常我們按以下原則進行垂直拆分: 

1,把不常用的字段單獨放在一張表;, 

2,把text,blob等大字段拆分出來放在附表中; 

3,經常組合查詢的列放在一張表中;

例如學生答題表tt:有如下字段: 

id name 分數 題目 回答 

其中題目和回答是比較大的字段,id name 分數比較小。

如果我們只想查詢id為8的學生的分數:select 分數 from tt where id = 8;雖然知識查詢分數,但是題目和回答這兩個大字段也是要被掃瞄的,很消耗效能。但是我們只關心分數,並不想查詢題目和回答。這就可以使用垂直分割。我們可以把題目單獨放到一張表中,通過id與tt表建立一對一的關係,同樣將回答單獨放到一張表中。這樣我們插敘tt中的分數的時候就不會掃瞄題目和回答了。

垂直切分的優點 

◆ 資料庫的拆分簡單明瞭,拆分規則明確; 

◆ 應用程式模組清晰明確,整合容易; 

◆ 資料維護方便易行,容易定位;

資料庫表如何水平拆分和垂直拆分

目前很多網際網路系統都存在單錶資料量過大的問題,這就降低了查詢速度,影響了客戶體驗。為了提高查詢速度,我們可以優化sql語句,優化表結構和索引,不過對那些百萬級千萬級的資料庫表,即便是優化過後,查詢速度還是滿足不了要求。這時候我們就可以通過分表降低單次查詢資料量,從而提高查詢速度,一般分表的方式有兩...

資料庫MySQL 資料庫表的水平拆分

表的水平拆分是為了解決單錶資料量過大的問題,水平拆分的表每乙個表的結構都是完全一致的,以下面的peyment表為例來說明 如果單錶的資料量達到上億條,那麼這時候我們儘管加了完美的索引,查詢效率低,寫入的效率也相應的降低。通常水平拆分的方法為 1 對customer id進行hash運算,如果要拆分為...

mysql水平拆分表

比如 將訂單詳情表按照客戶進行拆分 表名 order info 包含字段 orderid order表主鍵 order表有客戶id 將表按照客戶id進行拆分 方法1 create table order info 1 select from select oi.order info from ord...