隨着業務規模的不斷擴大,需要選擇合適的方案去應對數據規模的增長,以應對逐漸增長的訪問壓力和數據量。
關於數據庫的擴展主要包括:業務拆分、主從復制,數據庫分庫與分表。
(1)業務拆分
假設:Mysql一個數據庫中有三張表,shop表,goods表,history表。
隨着業務逐漸復雜,數據逐漸增多。數據庫的執行效率越來越低。
此時可以將三張表放到三個不同主機上人不同數據庫中,這樣對一個數據庫人壓力就分成了三份,系統的吞吐量就會大大提高。
(2)主從復制
MySQL的Replication是一個多MySQL數據庫做主從同步的方案,特點是異步復制,廣泛用在各種對MySQL有更高性能、更高可靠性要求的場合。
MySQL Replication 就是從服務器拉取主服務器上的 二進制日志文件,然后再將日志文件解析成相應的SQL語句在從服務器上重新執行一遍主服務器的操作,通過這種方式來保證數據的一致性。
特點:
主從間的數據庫不是實時同步,就算網絡連接正常,也存在瞬間主從數據不一致的情況。
如果主從的網絡斷開,則從庫會在網絡恢復正常后,批量進行同步。
如果對從庫進行修改數據,那么如果此時從庫正在在執行主庫的bin-log時,則會出現錯誤而停止同步,所以一般情況下,我們要非常小心的修改從庫上的數據。
一個衍生的配置是雙主、互為主從配置,只要雙方的修改不沖突,則可以工作良好。
如果需要多主庫的話,可以用環形配置,這樣任意一個節點的修改都可以同步到所有節點。
(3)數據庫分表、分區、分庫
分庫實現策略:對數據庫進行拆分,從而提高數據庫的寫入能力。
分表實現策略:分表就是將一個表分成多個表,比如有一個用戶表,因為用戶無限制地增長嚴重影響性能。假設有1000萬條數據,可以每10萬條數據建一個表,根據ID判斷屬於哪個表。
分區實現策略:分區是把存放數據的文件分成許多小塊,分區后人表還是一張表,可以突破磁盤的讀寫能力。
分區的適用場景:
1.一張表的查詢速度很慢
2.表中的數據可以分段
3.每次只是操作數據人一小部分,而不是全部
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);\
簡單的分庫就是把表分別存儲在不同人數據庫中
