一、什么是分區、分表、分庫
分區
就是把一張表的數據分成N個區塊,在邏輯上看最終只是一張表,但底層是由N個物理區塊組成的
分表
就是把一張表按一定的規則分解成N個具有獨立存儲空間的實體表。系統讀寫時需要根據定義好的規則得到對應的字表明,然后操作它。
分庫
一旦分表,一個庫中的表會越來越多
將整個數據庫比作圖書館,一張表就是一本書。當要在一本書中查找某項內容時,如果不分章節,查找的效率將會下降。而同理,在數據庫中就是分區。
二、常用的單機數據庫的瓶頸
問題描述
- 單個表數據量越大,讀寫鎖,插入操作重新建立索引效率越低。
- 單個庫數據量太大(一個數據庫數據量到1T-2T就是極限)
- 單個數據庫服務器壓力過大
- 讀寫速度遇到瓶頸(並發量幾百)
三、分區
什么時候考慮使用分區?
-
一張表的查詢速度已經慢到影響使用的時候。
-
sql經過優化
-
數據量大
-
表中的數據是分段的
-
對數據的操作往往只涉及一部分數據,而不是所有的數據
分區解決的問題
主要可以提升查詢效率
分區的實現方式(簡單)
mysql5 開始支持分區功能
CREATE TABLE sales (
id INT AUTO_INCREMENT,
amount DOUBLE NOT NULL,
order_day DATETIME NOT NULL,
PRIMARY KEY(id, order_day)
) ENGINE=Innodb
PARTITION BY RANGE(YEAR(order_day)) (
PARTITION p_2010 VALUES LESS THAN (2010),
PARTITION p_2011 VALUES LESS THAN (2011),
PARTITION p_2012 VALUES LESS THAN (2012),
PARTITION p_catchall VALUES LESS THAN MAXVALUE);
四、分表
什么時候考慮分表?
-
一張表的查詢速度已經慢到影響使用的時候。
-
sql經過優化
-
數據量大
-
當頻繁插入或者聯合查詢時,速度變慢
分表解決的問題
分表后,單表的並發能力提高了,磁盤I/O性能也提高了,寫操作效率提高了
- 查詢一次的時間短了
- 數據分布在不同的文件,磁盤I/O性能提高
- 讀寫鎖影響的數據量變小
- 插入數據庫需要重新建立索引的數據減少
分表的實現方式(復雜)
需要業務系統配合遷移升級,工作量較大
分區和分表的區別與聯系
-
分區和分表的目的都是減少數據庫的負擔,提高表的增刪改查效率。
-
分區只是一張表中的數據的存儲位置發生改變,分表是將一張表分成多張表。
-
當訪問量大,且表數據比較大時,兩種方式可以互相配合使用。
-
當訪問量不大,但表數據比較多時,可以只進行分區。
常見分區分表的規則策略(類似)
- Range(范圍)
- Hash(哈希)
- 按照時間拆分
- Hash之后按照分表個數取模
- 在認證庫中保存數據庫配置,就是建立一個DB,這個DB單獨保存user_id到DB的映射關系