三個概念區別
| 維度 | 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+)
- 全文索引、空間索引不支援
選型決策樹
- 單表 < 5000 萬行、查詢無瓶頸 → **不分區、不拆分**
- 單表 > 5000 萬、明顯熱/冷數據、按時間查詢 → **RANGE 分區表**
- 業務明確可拆、需微服務解耦 → **垂直拆庫/拆表**
- 寫入 QPS 極高、單庫抗不住 → **水平分庫分表 (ShardingSphere/Proxy/自研)**
- 多地多活、跨機房 → **水平拆分 + 同步工具**
最佳實踐
- 分區表配合
partition_pruning 優化器特性
- 定期
REORGANIZE PARTITION 合併小分區
- 監控
INFORMATION_SCHEMA.PARTITIONS 行數、大小
- 避免在分區鍵上使用函數導致裁剪失效