MySQL 分區是將一張大表根據特定的分區鍵(如範圍值、離散值列表、哈希函數值)劃分為多個較小的物理塊,每個分區獨立存儲數據與索引。這項技術將大對象拆解為小對象,能有效提升查詢性能、簡化數據維護,特別適合海量數據場景。
基於連續區間將數據映射到不同分區,使用 VALUES LESS THAN 定義邊界。
CREATE TABLE range_test (
id INT UNSIGNED,
name VARCHAR(30) NOT NULL,
age INT UNSIGNED NOT NULL,
PRIMARY KEY (id, name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
PARTITION BY RANGE (id) (
PARTITION p0 VALUES LESS THAN (10),
PARTITION p1 VALUES LESS THAN (20),
PARTITION p2 VALUES LESS THAN MAXVALUE
);
關鍵特性:
ALTER TABLE ... DROP PARTITION 秒級完成),及頻繁按分區鍵查詢的場景(分區剪枝提升效率)。基於枚舉值列表分區,使用 PARTITION BY LIST(expr) 配合 VALUES IN。
CREATE TABLE list_test (
id INT UNSIGNED,
name VARCHAR(30) NOT NULL,
age INT UNSIGNED NOT NULL,
PRIMARY KEY (id, name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
PARTITION BY LIST (id) (
PARTITION p0 VALUES IN (10, 5, 30),
PARTITION p1 VALUES IN (20, 60, 70)
);
注意: 插入的值必須在列表中,否則報錯;NULL 必須顯式出現在某分區列表中。
根據指定分區數,通過哈希函數將數據均勻分散,主要用於消除熱點讀寫。
CREATE TABLE hash_test (
id INT UNSIGNED,
name VARCHAR(30) NOT NULL,
age INT UNSIGNED NOT NULL,
PRIMARY KEY (id, name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
PARTITION BY HASH (id) PARTITIONS 4;
由 MySQL 內部哈希函數實現,支持除 BLOB/TEXT 外的所有類型,未指定分區鍵時默認使用主鍵,分區鍵不可為 NULL,大數據量下同樣能有效分散熱點。
CREATE TABLE key_test (
id INT UNSIGNED,
name VARCHAR(30) NOT NULL,
age INT UNSIGNED NOT NULL,
PRIMARY KEY (id, name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
PARTITION BY KEY (id) PARTITIONS 4;
| 分區類型 | NULL 處理方式 |
|---|---|
| RANGE | 視為最小值 |
| HASH / KEY | 視為 0 值 |
| LIST | 必須顯式列入值列表,否則報錯 |
EXPLAIN PARTITIONS 驗證分區剪枝是否生效;ANALYZE TABLE 更新分區統計信息,確保優化器決策準確。