在 MySQL 中,分區表是將大表數據按一定規則拆分到多個物理子表中,可提升查詢效率(尤其是大數據量場景)。MySQL 支持多種分區類型,以下是常見的分區創建方法:
-
分區表的所有分區必須使用相同的存儲引擎。
-
主鍵或唯一索引必須包含分區字段(否則無法創建分區)。
按字段的范圍值分區(如按時間、數值范圍),適合日志、訂單等有時間序列的數據。
示例:按訂單日期分區
CREATE TABLE orders (
id INT PRIMARY KEY AUTO_INCREMENT,
order_no VARCHAR(20) NOT NULL,
amount DECIMAL(10,2),
create_time DATE NOT NULL
)
PARTITION BY RANGE (TO_DAYS(create_time)) (
PARTITION p202301 VALUES LESS THAN (TO_DAYS('2023-02-01')),
PARTITION p202302 VALUES LESS THAN (TO_DAYS('2023-03-01')),
PARTITION p202303 VALUES LESS THAN (TO_DAYS('2023-04-01')),
PARTITION p_other VALUES LESS THAN MAXVALUE
);
-
按
create_time 字段的天數(TO_DAYS() 轉換)分區,每個分區存儲一個月的數據。
-
p_other 用于存儲未匹配到前面分區的數據,避免插入數據失敗。
按字段的離散值分區(如按地區、狀態碼),適合字段值固定且有限的場景。
示例:按地區分區
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
region_id INT NOT NULL
)
PARTITION BY LIST (region_id) (
PARTITION p_north VALUES IN (1,4,5),
PARTITION p_east VALUES IN (2,6),
PARTITION p_south VALUES IN (3)
);
-
每個分區包含指定的
region_id 列表,插入數據時根據 region_id 分配到對應分區。
按字段的哈希值均勻分配數據,適合數據分布較均勻、無明顯范圍特征的場景。
示例:按用戶 ID 哈希分區
CREATE TABLE logs (
id INT PRIMARY KEY,
content TEXT,
user_id INT NOT NULL
)
PARTITION BY HASH (user_id)
PARTITIONS 4;
-
MySQL 會自動計算
user_id 的哈希值,將數據平均分配到 4 個分區中。
類似哈希分區,但由 MySQL 自動計算哈希值(支持字符串等更多類型)。
示例:按用戶名鍵分區
CREATE TABLE user_login (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL
)
PARTITION BY KEY (username)
PARTITIONS 3;
SELECT PARTITION_NAME, TABLE_ROWS
FROM INFORMATION_SCHEMA.PARTITIONS
WHERE TABLE_NAME = 'orders';
ALTER TABLE orders
ADD PARTITION (
PARTITION p202304 VALUES LESS THAN (TO_DAYS('2023-05-01'))
);
ALTER TABLE orders DROP PARTITION p202301;
-
查詢優化:查詢時盡量包含分區字段(如
WHERE create_time = '2023-01-15'),MySQL 會只掃描對應分區,提升效率。
-
分區鍵選擇:優先選擇查詢頻繁、區分度高的字段(如時間、地區)。
-
避免過度分區:分區數量過多(如超過 1000 個)可能反而降低性能。
-
版本支持:某些分區功能(如子分區)在 MySQL 5.7+ 版本才完善,建議使用 8.0 及以上版本。
合理使用分區可以顯著提升大表的查詢和維護效率,尤其適合數據量百萬級以上的場景。