mysql的水平分表和垂直分表

2021-08-07 17:12:24 字數 1542 閱讀 7584

1,水平分割:

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

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

這就是水平分割。

2,垂直分割:

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

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

id name 分數 題目 回答

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

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

3,其他要點:

1)存放、檔案等大檔案用檔案系統儲存。資料庫只儲存路徑,和檔案存放在檔案系統,甚至單獨存放在一台伺服器(圖床)。

2)資料引數配置。

最重要的引數就是記憶體,我們主要用的innodb引擎,所以下面兩個引數調的很大:

innodb_additional_mem_pool_size=64m

innodb_buffer_pool_size=1g

對於myisam,需要調整key_buffer_size,當然調整引數還是要看狀態,用show status語句可以看到當前狀態,以決定該調整哪些引數。

4,合理的硬體資源和作業系統

如果機器的記憶體超過4g,那麼應當採用64位作業系統和64位mysql。

案例:簡單購物系統暫設涉及如下表:

1.產品表(資料量10w,穩定)

2.訂單表(資料量200w,且有增長趨勢)

3.使用者表 (資料量100w,且有增長趨勢)

以mysql為例講述下水平拆分和垂直拆分,mysql能容忍的數量級在百萬靜態資料可以到千萬

垂直拆分:

解決問題:

表與表之間的io競爭

不解決問題:

單錶中資料量增長出現的壓力

方案:把產品表和使用者表放到乙個server上

訂單表單獨放到乙個server上

水平拆分:

解決問題:

單錶中資料量增長出現的壓力

不解決問題:

表與表之間的io爭奪

方案:使用者表通過性別拆分為男使用者表和女使用者表

訂單表通過已完成和完成中拆分為已完成訂單和未完成訂單

產品表 未完成訂單放乙個server上

已完成訂單表盒男使用者表放乙個server上

女使用者表放乙個server上

mysql 水平分表 垂直分表

mysql的分表技術 水平分割技術 以qq使用者登入為例 建立uuid表 create table uuid id int unsigned primary key auto increment 建立3張使用者表 create table qqlogin0 id int unsigned prima...

垂直分表水平分表

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 分表技術 表的結構不能變 分表技術有 水平分割和垂直分割 當一張越來越大時候,即使新增索引還慢的話,我們可以使用分表 以qq使用者表來具體的說明...

什麼是垂直分庫分表,水平分庫分表

垂直分片 按照業務拆分的方式稱為垂直分片,又稱為縱向拆分,它的核心理念是專庫專用。在拆分之前,乙個資料庫由多個資料表構成,每個表對應著不同的業務。而拆分之後,則是按照業務將表進行歸類,分布到不同的資料庫中,從而將壓力分散至不同的資料庫。下圖展示了根據業務需要,將使用者表和訂單表垂直分片到不同的資料庫...