當單表資料達百萬級,查詢效能顯著下降。分表旨在降低單表資料量、縮短鎖競爭、提升並發吞吐。本文深度剖析三大主流分表方案優劣與適用場景。
| 技術 | 代表方案 |
|---|---|
| 原生叢集 | MySQL Cluster (NDB) |
| 中間件代理 | MySQL Proxy、MyCat、ShardingSphere |
| 複寫架構 | 主從複寫、雙主互備、MHA、MGR |
| 區塊複寫 | DRBD |
優點:應用層無感、擴展性佳、單表資料量不變但負載分散
缺點:單表資料量未減、硬體成本高、運維複雜度大
預估高增長表(如論壇貼文、聊天記錄),預先建立 N 張同結構表(如 message_00 ~ message_99),按規則路由。
function get_hash_table($table, $userid) {
$str = crc32($userid);
if ($str < 0) {
$hash = "0" . substr(abs($str), 0, 1);
} else {
$hash = substr($str, 0, 2);
}
return $table . "_" . $hash;
}
// user18991 → message_10
// user34523 → message_13
優點:單表資料量可控、查詢效能穩定、無中間件依賴
缺點:
將多張同結構 MyISAM 表通過 MERGE 引擎聚合為邏輯視圖。
CREATE TABLE user1 (id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50), sex INT) ENGINE=MyISAM;
CREATE TABLE user2 (id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50), sex INT) ENGINE=MyISAM;
INSERT INTO user1 (name, sex) VALUES ('張三', 0);
INSERT INTO user2 (name, sex) VALUES ('李四', 1);
CREATE TABLE alluser (
id INT NOT NULL AUTO_INCREMENT,
name VARCHAR(50), sex INT,
INDEX(id)
) ENGINE=MERGE UNION=(user1,user2) INSERT_METHOD=LAST;
SELECT * FROM alluser; -- 可跨表查詢
INSERT INTO alluser (name, sex) VALUES ('王五', 0); -- 寫入 user2 (LAST)
ALTER TABLE 會破壞映射關係REPLACE、特定 UPDATE 行為需實測驗證| 維度 | 叢集/中間件 | 應用層預分表 | MERGE 引擎 |
|---|---|---|---|
| 應用改動 | 無/極小 | 大(路由邏輯) | 小(僅改表名) |
| 單表資料量 | 不變 | 可控 | 可控 |
| 擴展性 | 優 | 差 | 中 |
| 跨表查詢 | 透明 | 應用層處理 | 透明 |
| 交易支援 | 視引擎 | 視引擎 | 無 |
| 運維成本 | 高 | 中 | 低 |
分表非銀彈,應基於實際瓶頸分析、業務增長預測、團隊運維能力綜合決策,漸進式演進優於大爆炸重構。