核心概念辨析
| 維度 | 分表 | 分區 |
| 本質 | 邏輯上拆分為多張獨立表 | 物理上將一張表數據切片 |
| 文件表現 | 每分表擁有獨立 .frm/.MYD/.MYI | 單 .frm,數據/索引按分區生成多文件 |
| 應用透明度 | 需中間件/代碼路由 (Merge 引擎除外) | 完全透明,SQL 無感知 |
| 主解決問題 | 單表併發寫入瓶頸、業務隔離 | 單表體積過大、歷史數據歸檔、磁盤 I/O 瓶頸 |
實現方式對比
分表:Merge 引擎範例
# 文件列表
alluser.frm # 總表定義 (無 .MYD/.MYI)
alluser.MRG # 映射文件
user1.frm, user1.MYD, user1.MYI
user2.frm, user2.MYD, user2.MYI
# MRG 文件內容
user1
user2
#INSERT_METHOD=LAST
- 總表為「殼」,無數據,僅存分表映射與插入策略
- 查詢走總表,實際路由到分表
- 優點:簡單、應用可透明 (若用 Merge)
- 缺點:不支援外鍵、事務、替換引擎受限
分區:RANGE 分區範例
# 文件列表
aa.frm
aa.par # 分區元數據
aa#P#p1.MYD, aa#P#p1.MYI
aa#P#p3.MYD, aa#P#p3.MYI
- 單表單 .frm,
.par 存分區定義
- 數據文件按分區切片 (
#P#p1)
- 支援 RANGE、LIST、HASH、KEY、LINEAR HASH、LINEAR KEY、子分區
性能側重差異
| 指標 | 分表 | 分區 |
| 併發能力 | ✅ 顯著提升 (壓力分散到多表) | ⚠️ 單表鎖仍存在,分區裁剪減少掃描 |
| 磁盤 I/O | ✅ 分散 (多文件並行) | ✅ 核心優勢:可將分區分佈到不同物理磁盤 |
| 查詢裁剪 | 需中間件支援 | ✅ 優化器自動 Partition Pruning |
| 維護操作 | 單表操作,需遍歷所有分表 | ✅ ALTER TABLE ... DROP/ADD/REORGANIZE PARTITION 秒級 |
| 擴容遷移 | 極難 (需重新分片、數據遷移) | 支援分區拆分/合併,但在線操作受限 |
實現難度與透明度
- Merge 分表:難度 ≈ 分區,應用透明
- 應用層/中間件分表:難度高,需改造 SQL 路由
- 分區:DDL 一行搞定,應用零感知
聯合使用策略
-- 大表先分區 (按時間 RANGE),熱分區再分表 (按用戶 HASH)
CREATE TABLE orders_2024 (
id BIGINT, user_id BIGINT, amount DECIMAL(10,2), create_time DATETIME
) PARTITION BY RANGE (YEAR(create_time)) (
PARTITION p2024 VALUES LESS THAN (2025)
);
-- p2024 熱分區再通過中間件按 user_id 分 16 表
-- orders_2024_00 ~ orders_2024_15
- 訪問量大、數據量大雙重壓力時組合使用
- Merge 分表不可與分區混用,需用其他分表方案 (中間件/應用層)
- 冷數據分區歸檔 (移至廉價存儲),熱數據分表承載高併發
選型決策樹
- 單表 > 2000萬行 / 20GB → 優先分區 (維護簡單、透明)
- 寫入 QPS > 5000、鎖爭用嚴重 → 分表 (併發擴展)
- 需按時間歸檔、不同存儲介質 → 分區 (物理隔離)
- 業務強隔離 (多租戶、多業務線) → 分表/分庫
- 以上皆有 → 分區 + 分表組合