分表 通常指:通過應用程式層,將數據劃分到不同的表中進行存儲 對比分區,分區是在伺服器層完成的分區演算法 分表會導致客戶端明顯的改變,在伺服器端出現結構相同的多張表,甚至可以把多張表分到不同的伺服器上 以賬單表為例:資料庫可能會有這樣的情況 create table bill201710( id in ...
分表
通常指:通過應用程式層,將數據劃分到不同的表中進行存儲
對比分區,分區是在伺服器層完成的分區演算法
分表會導致客戶端明顯的改變,在伺服器端出現結構相同的多張表,甚至可以把多張表分到不同的伺服器上
以賬單表為例:資料庫可能會有這樣的情況
create table bill201710( id int unsigned auto_increment primary key, user_ud int unsigned, amount decimal(10,2), date int );
create table bill201711( id int unsigned auto_increment primary key, user_ud int unsigned, amount decimal(10,2), date int );
create table bill201712( id int unsigned auto_increment primary key, user_ud int unsigned, amount decimal(10,2), date int );
而是又Java等代碼進行處理,區分應該選擇哪一張表,根據傳遞的時間參數進行劃分
實際中,有一個比較麻煩的問題,主鍵ID的問題,理論上ID是不可以重覆的
解決方案:
(1)代碼層面,手動做一個自增ID,不穩妥
(2)利用資料庫,新建一張獨立地表,一張生成ID地表
create table billid( id int unsigned auto_increment primary key )
在插入真正的賬單之前,先去ID表取一個ID,這種方式也是常用的方式
分表的原因:
(1)為資料庫減壓
(2)資料庫分區演算法的局限性,也是最重要的原因
(3)數據的支持不完善,老版本mysql不支持分區
分區和分表都稱之為水平分割,於是有了垂直分割:
垂直分割:
每個表記錄數量一直,但是欄位不一致
這種方式其實不是太推薦的
無論垂直還是水平分割,本質都是把大的單位劃分為小的單位
橫向擴展MySQL伺服器:
由多台MySQL伺服器提供數據存儲伺服器
橫向擴展是從根本上提升資料庫性能的手段,受限於單台電腦的性能,使用多台電腦完成同一個服務的支持
比較典型的概念是:讀寫分離,負載均衡
讀寫分離:
由一部分MySQL伺服器提供讀操作:SELECT
另一些MySQL伺服器提供寫操作:UPDATE,DELETE,INSERT
以前有寫過在Java的SSM中如何配置讀寫分離:
https://www.cnblogs.com/xuyiqing/p/10648103.html
以及在Windows中配置MySQL的主從同步:
https://www.cnblogs.com/xuyiqing/p/10647133.html
負載均衡:
當存在多台伺服器提供一個任務時,需要從其中選擇某台完成當前任務,就是選擇負載均衡
負載均衡技術有很多,不如Nginx,Zuul等等,不過和MySQL不在一個層次
在mysql架構中,往往採用的是一寫多讀的架構,這裡的多台讀伺服器就需要做負載均衡
典型的負載均衡演算法有:平均輪詢,加權輪詢,負載分配
負載均衡的實現可以用中間件,也可以在Java代碼中實現
比如SpringBoot配置多個數據源,SpringCloud多謝幾個DAO層的服務,並且每個服務調用不同的數據源即可解決