一、垂直分庫
垂直分庫是將一張包含多個欄位的大表按照不同的業務拆分到不同的資料庫中,每個資料庫中只包含相應業務的欄位,從而達到降低單個表的數據量的目的。
實現方式一般是通過資料庫的視圖或者觸發器來實現,這裡我們以MySQL為例進行詳細講解。下面是創建視圖語法:
CREATE VIEW view_name AS SELECT column_name(s) FROM table_name WHERE condition;
下面是創建觸發器語法:
CREATE TRIGGER trigger_name trigger_time trigger_event ON table_name FOR EACH ROW BEGIN -- 觸發器內容 END;
下面是一個使用視圖實現垂直分庫的示例代碼:
-- 創建視圖,只包含user_id和user_name欄位 CREATE VIEW user_info_view AS SELECT user_id, user_name FROM user_info; -- 創建用戶訂單表 CREATE TABLE user_order ( id int(11) NOT NULL AUTO_INCREMENT, user_id int(11) NOT NULL, ... PRIMARY KEY (id)); -- 在訂單表中使用user_info_view視圖 CREATE TRIGGER user_order_insert BEFORE INSERT ON user_order FOR EACH ROW SET NEW.user_name = (SELECT user_name FROM user_info_view WHERE user_id = NEW.user_id);
二、水平分庫
水平分庫是將一張大表按照某個欄位進行拆分,將拆分後的數據分散到不同的資料庫中,例如根據用戶ID將用戶信息分布到多個資料庫中,從而避免單個資料庫壓力過大。
實現方式一般是通過中間件或者應用程序來實現數據路由和數據分片,這裡我們以TiDB為例進行詳細講解。下面是創建分片表的語法:
CREATE TABLE table_name ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(255) NOT NULL, PRIMARY KEY (id) ) PARTITION BY RANGE (id) ( PARTITION p0 VALUES LESS THAN (100), PARTITION p1 VALUES LESS THAN (200), PARTITION p2 VALUES LESS THAN (300), PARTITION p3 VALUES LESS THAN MAXVALUE );
上述創建語句中,使用了PARTITION BY RANGE (id)關鍵字來指定按照id欄位進行分片,根據id欄位的值將數據存儲到不同的分區中。這裡我們將數據按照id欄位的值分成了4個分區。
三、水平分表
水平分表是將一張大表按照某種規則拆分成多個小表,例如根據時間將一張訂單表拆分成多個小表,每個小表只包含某個時間段內的訂單數據。
實現方式一般是通過應用程序來實現,即根據業務需要動態創建和刪除表,將不同時間段的數據存儲到不同的表中。下面是一個動態創建表的示例代碼:
-- 將時間格式化為年月日 $date = date('Ymd', strtotime($time)); -- 構造表名 $tableName = 'order_' . $date; -- 查詢資料庫是否存在當前表 $sql = "SHOW TABLES LIKE '$tableName'"; $table = $db -> query($sql) -> fetchAll(); -- 如果表不存在則創建表 if (empty($table)) { // 創建訂單表 $sql = "CREATE TABLE $tableName ( id INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, order_no VARCHAR(32) NOT NULL, ...)"; $db -> query($sql); } -- 插入數據到訂單表中 $sql = "INSERT INTO $tableName (order_no, ...) VALUES (?, ...)"; $db -> query($sql, [$orderNo, ...]);
四、分散式資料庫
分散式資料庫是將數據分散到多個節點上,通過數據之間的分散式協作來實現數據處理。
實現方式一般是通過分散式資料庫中間件來實現,例如MySQL集群、TiDB等。
下面是TiDB的一個示例代碼:
-- 連接TiDB集群 $dsn = 'mysql:host=127.0.0.1;port=4000;dbname=test'; $db = new \PDO($dsn, 'root', ''); -- 查詢數據 $sql = "SELECT * FROM user_info WHERE user_id = ?"; $userId = 1; $rows = $db -> query($sql, [$userId]) -> fetchAll(PDO::FETCH_ASSOC);
五、數據同步
在使用分庫分表的過程中,由於數據被分散到多個資料庫中,必然會出現數據不一致的問題,需要使用數據同步技術來解決數據不一致的問題。
實現方式一般是通過將主庫的數據同步到備庫中,用於備庫的讀取。
下面是使用MySQL主從複製實現數據同步的示例代碼:
-- 配置主庫 [mysqld] log-bin=mysql-bin server-id=1 -- 配置從庫 [mysqld] server-id=2 relay-log=mysql-relay-bin log_slave_updates=1 -- 在主庫上創建用戶信息表 CREATE TABLE user_info ( user_id INT(11) NOT NULL PRIMARY KEY, user_name VARCHAR(255) NOT NULL, ...); -- 在從庫上讀取用戶信息 SELECT * FROM user_info;
六、總結
以上是分庫分表的幾種實現形式,每種實現形式都有其獨特的優缺點,需要根據實際業務情況進行選擇。同時,在使用分庫分表技術的時候,需要考慮到數據一致性、數據分散性、負載均衡等問題,從而保證分庫分表的順利運行。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/162664.html