在互聯網公司或者一些併發量比較大的項目,雖然有各類項目架構設計、NoSQL、MQ、ES等解決比較高的併發訪問,可是對於數據庫來講,壓力面試
仍是太大,這時候即便數據庫架構、表結構、索引等都設計的很好了,可是仍是扛不住的,主從複製經過讀寫分離緩解讀負載。可是像淘寶這種項目,數據庫
單一數據庫確定是不行的,爲了解決這個問題,就可使用分庫分表架構
PS:這是一篇學習博客,本人沒實操過,適合做爲入門瞭解或者面試,若是深刻了解,請自行百度大佬的文章併發
分庫分表的方式:函數
一、把一個實例的多個數據庫拆分到不一樣的實例,這個實例多是數據庫集羣工具
優缺點:性能
操做簡單學習
可是若是寫壓力存在某個庫,這樣拆分仍是沒法解決問題spa
二、把一個庫中的表拆分到不一樣的數據庫架構設計
例如:把一個庫中的訂單表、商品表、購物車表分別拆分到不一樣的數據庫
三、水平拆分
在前面兩種狀況沒法解決的狀況下,就要使用水平拆分
對一個庫中的相關表進行水平拆分到不一樣實例的數據庫,進行分片處理
分片處理是最後的方案,能在以前解決問題,就不要分片,分片以後會帶來不少問題,也會變得複雜
分區鍵決定了分區後的性能,如何選擇分區鍵:
一、分區鍵要能儘可能避免跨分片查詢的發生
二、分區鍵要儘量使各個分片中的數據平均
如何存儲不須要分片的表:
一、每一個分片存儲一份相同的數據,數據量不大且不多更新的表
二、使用額外的節點同一存儲
如何在節點上部署分片:
每一個分片使用單一數據庫,且數據庫名相同
將多個分片表存儲在一個數據庫中,在表名後加上分片號後綴
在一個節點中部署多個數據庫,每一個數據庫包含一個分片
如何分配分片中的數據:
按照分區鍵的Hash值取模來獲取分片數據
按照分區鍵的範圍來分配分片數據,通常日期類型可使用這種
使用分區鍵和分片的映射表來分配分片數據
如何生成全局ID:
使用auto_increment_increment(和分片數量一致)和auto_increment_offset參數,只適用於一個節點保存一個分片的場景
使用全局節點生成ID,先獲取全局節點ID,再經過分區函數插入到對應的分片中,可是這個全局節點可能成爲性能瓶頸
在Redis中建立全局ID,最優選擇
能夠經過工具OneProxy來進行數據庫分片,原本想要手動操做的,可是發現oneProxy官網沒了。。。