在MySQL中,隨著業務數據的增長,單個數據庫可能無法應對高并發、海量數據的處理請求。一種有效的解決方案是采用分庫分表的方式將數據分散到多個數據庫中進行存儲和查詢。
下面介紹幾種常見的分庫分表實現方案:
1. 垂直分庫
CREATE DATABASE db1; -- 創建數據庫1 CREATE DATABASE db2; -- 創建數據庫2 -- 將原數據表按照業務關系拆分到不同的數據庫中 CREATE TABLE db1.user_info ( id INT(11) NOT NULL AUTO_INCREMENT, name VARCHAR(50), PRIMARY KEY (id) ); CREATE TABLE db2.order_info ( id INT(11) NOT NULL AUTO_INCREMENT, user_id INT(11), order_date DATE, PRIMARY KEY (id), INDEX (user_id) );
垂直分庫將原來的單個數據庫中的數據表按照業務拆分到多個不同的數據庫中。這種方式可以將不同的數據表放到不同的數據庫,更好的進行數據隔離、資源隔離。但是,垂直分庫過度劃分數據表可能會增加數據庫之間的關聯關系,增加系統復雜度。
2. 水平分表
CREATE TABLE user_info ( id INT(11) NOT NULL AUTO_INCREMENT, name VARCHAR(50), PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 PARTITION BY HASH(id) PARTITIONS 5; CREATE TABLE order_info ( id INT(11) NOT NULL AUTO_INCREMENT, user_id INT(11), order_date DATE, PRIMARY KEY (id), INDEX (user_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 PARTITION BY RANGE(order_date)( PARTITION p0 VALUES LESS THAN ('2020-01-01'), PARTITION p1 VALUES LESS THAN ('2021-01-01'), PARTITION p2 VALUES LESS THAN ('2022-01-01'), PARTITION p3 VALUES LESS THAN ('2023-01-01'), PARTITION p4 VALUES LESS THAN MAXVALUE );
水平分表將單個數據表按照水平方向進行切分,把數據分散到多個服務器或多個不同的數據表中存儲。這種方式可以擴展單個數據表的存儲容量,提高數據讀寫的性能。但是,水平分表對于表之間的關聯查詢可能會帶來一些麻煩。
3. 水平分庫
-- 創建數據表路由表 CREATE TABLE db_route ( id INT(11) NOT NULL AUTO_INCREMENT, db_name VARCHAR(50), PRIMARY KEY (id) ); INSERT INTO db_route (db_name) VALUES ('db1'), ('db2'), ('db3'); CREATE TABLE user_info ( id INT(11) NOT NULL AUTO_INCREMENT, name VARCHAR(50), PRIMARY KEY (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 PARTITION BY HASH(id) PARTITIONS 5; CREATE TABLE order_info ( id INT(11) NOT NULL AUTO_INCREMENT, user_id INT(11), order_date DATE, PRIMARY KEY (id), INDEX (user_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 PARTITION BY RANGE(order_date)( PARTITION p0 VALUES LESS THAN ('2020-01-01'), PARTITION p1 VALUES LESS THAN ('2021-01-01'), PARTITION p2 VALUES LESS THAN ('2022-01-01'), PARTITION p3 VALUES LESS THAN ('2023-01-01'), PARTITION p4 VALUES LESS THAN MAXVALUE );
水平分庫將整個數據庫按照業務拆分到多個不同的數據庫中。同樣的,需要建立數據表路由表,根據路由表來確定數據表的存儲位置。這種方式相對于垂直切割和水平切割來說,引入了更多的數據表之間的關聯查詢問題,比較適合于需要管理多個實例的大型系統。