1,水平分割:mysql
例:QQ的登陸表。假設QQ的用戶有100億,若是隻有一張表,每一個用戶登陸的時候數據庫都要從這100億中查找,會很慢很慢。若是將這一張表分紅100份,每張表有1億條,就小了不少,好比qq0,qq1,qq1...qq99表。sql
用戶登陸的時候,能夠將用戶的id%100,那麼會獲得0-99的數,查詢表的時候,將表名qq跟取模的數鏈接起來,就構建了表名。好比123456789用戶,取模的89,那麼就到qq89表查詢,查詢的時間將會大大縮短。數據庫
這就是水平分割。服務器
2,垂直分割:性能
垂直分割指的是:表的記錄並很少,可是字段卻很長,表佔用空間很大,檢索表的時候須要執行大量的IO,嚴重下降了性能。這時須要把大的字段拆分到另外一個表,而且該表與原表是一對一的關係。操作系統
例如學生答題表tt:有以下字段:server
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上