更新時間:2022-10-11 來源:黑馬程序員 瀏覽量:
隨著互聯網及移動互聯網的發展,應用系統的數據量也是成指數式增長,若采用單數據庫進行數據存儲,存在以下性能瓶頸:
1. IO瓶頸:熱點數據太多,數據庫緩存不足,產生大量磁盤IO,效率較低。 請求數據太多,帶寬不夠,網絡IO瓶頸。
2. CPU瓶頸:排序、分組、連接查詢、聚合統計等SQL會耗費大量的CPU資源,請求數太多,CPU出現瓶頸。
為了解決上述問題,我們需要對數據庫進行分庫分表處理。
分庫分表的中心思想都是將數據分散存儲,使得單一數據庫/表的數據量變小來緩解單一數據庫的性能問題,從而達到提升數據庫性能的目的。
分庫分表的形式,主要是兩種:垂直拆分和水平拆分。而拆分的粒度,一般又分為分庫和分表,所以組成的拆分策略最終如下:
垂直分庫以表為依據,根據業務將不同表拆分到不同庫中。所以拆分完的每個庫的表結構都不一樣。每個庫的數據也不一樣。所有庫的并集是全量數據。
垂直分表以字段為依據,根據字段屬性將不同字段拆分到不同表中。并且每個表的結構都不一樣。每個表的數據也不一樣,一般通過一列(主鍵/外鍵)關聯。所有表的并集是全量數據。
(1)水平分庫
水平分庫:以字段為依據,按照一定策略,將一個庫的數據拆分到多個庫中。在水平分庫中每個庫的表結構都一樣。每個庫的數據都不一樣。所有庫的并集是全量數據。
(2)水平分表
水平分表以字段為依據,按照一定策略,將一個表的數據拆分到多個表中。特點:每個表的表結構都一樣。每個表的數據都不一樣。所有表的并集是全量數據。
在業務系統中,為了緩解磁盤IO及CPU的性能瓶頸,到底是垂直拆分,還是水平拆分;具體是分庫,還是分表,都需要根據具體的業務需求具體分析。
shardingJDBC:基于AOP原理,在應用程序中對本地執行的SQL進行攔截,解析、改寫、路由處理。需要自行編碼配置實現,只支持java語言,性能較高。
MyCat:數據庫分庫分表中間件,不用調整代碼即可實現分庫分表,支持多種語言,性能不及前者。