分庫分表的幾種實現形式

一、垂直分庫

垂直分庫是將一張包含多個字段的大表按照不同的業務拆分到不同的數據庫中,每個數據庫中只包含相應業務的字段,從而達到降低單個表的數據量的目的。

實現方式一般是通過數據庫的視圖或者觸發器來實現,這裡我們以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-hant/n/162664.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-21 22:46
下一篇 2024-11-21 22:46

相關推薦

發表回復

登錄後才能評論