首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 分區表 vs 垂直/水平拆分:概念釐清與選型指南

     編輯:MySQL 綜合教學

三個概念區別

維度MySQL 分區表垂直拆分水平拆分
層級**單表內部**物理文件切分**架構層面**按業務拆庫/拆表**架構層面**按數據範圍拆表
透明性應用無感,SQL 不變應用需路由,中間件/代理支援應用需路由,分庫鍵/分表鍵
目的大表性能、存儲管理、歷史歸檔微服務解耦、核心/非核心隔離單表過大、寫入熱點、跨機房
實現RANGE/LIST/HASH/KEY 分區不同庫/表,甚至不同實例相同結構表,分佈不同節點

MySQL 分區表詳解

類型

  • RANGE:按範圍(時間、ID 區間),最常用
  • LIST:離散值集合(地區、狀態)
  • HASH:均勻分佈,無熱點
  • KEY:類似 HASH,支援非整數列

示例:按月 RANGE 分區

CREATE TABLE orders (
  id BIGINT NOT NULL,
  created_at DATETIME NOT NULL,
  amount DECIMAL(10,2)
) ENGINE=InnoDB
PARTITION BY RANGE (YEAR(created_at)*100 + MONTH(created_at)) (
  PARTITION p202301 VALUES LESS THAN (202302),
  PARTITION p202302 VALUES LESS THAN (202303),
  PARTITION p202303 VALUES LESS THAN (202304),
  PARTITION pmax VALUES LESS THAN MAXVALUE
);

優勢

  • 分區裁剪:查詢僅掃描相關分區
  • 快速歸檔:ALTER TABLE ... DROP PARTITION 秒級刪除歷史數據
  • 維護靈活:單分區 OPTIMIZE/CHECK/REBUILD

限制

  • 分區鍵必須包含在主鍵/唯一鍵中
  • 外鍵不支援
  • 最大 8192 個分區 (5.7+)
  • 全文索引、空間索引不支援

選型決策樹

  1. 單表 < 5000 萬行、查詢無瓶頸 → **不分區、不拆分**
  2. 單表 > 5000 萬、明顯熱/冷數據、按時間查詢 → **RANGE 分區表**
  3. 業務明確可拆、需微服務解耦 → **垂直拆庫/拆表**
  4. 寫入 QPS 極高、單庫抗不住 → **水平分庫分表 (ShardingSphere/Proxy/自研)**
  5. 多地多活、跨機房 → **水平拆分 + 同步工具**

最佳實踐

  • 分區表配合 partition_pruning 優化器特性
  • 定期 REORGANIZE PARTITION 合併小分區
  • 監控 INFORMATION_SCHEMA.PARTITIONS 行數、大小
  • 避免在分區鍵上使用函數導致裁剪失效
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved