首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 分表 vs 分區深度對比:實現原理、性能侧重與聯合使用策略

     編輯:MySQL 資料庫相關知識

核心概念辨析

維度分表分區
本質邏輯上拆分為多張獨立表物理上將一張表數據切片
文件表現每分表擁有獨立 .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 分表不可與分區混用,需用其他分表方案 (中間件/應用層)
  • 冷數據分區歸檔 (移至廉價存儲),熱數據分表承載高併發

選型決策樹

  1. 單表 > 2000萬行 / 20GB → 優先分區 (維護簡單、透明)
  2. 寫入 QPS > 5000、鎖爭用嚴重 → 分表 (併發擴展)
  3. 需按時間歸檔、不同存儲介質 → 分區 (物理隔離)
  4. 業務強隔離 (多租戶、多業務線) → 分表/分庫
  5. 以上皆有 → 分區 + 分表組合
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved