MySQL 分区表选择与维护(RANGE, LIST, HASH)
分区将大表拆分为多个物理段,提升查询和维护效率。
1. RANGE 分区(按时间范围)
CREATE TABLE orders (
id INT,
order_date DATE,
amount DECIMAL(10,2)
) PARTITION BY RANGE (YEAR(order_date)) (
PARTITION p2023 VALUES LESS THAN (2024),
PARTITION p2024 VALUES LESS THAN (2025),
PARTITION p2025 VALUES LESS THAN (2026),
PARTITION p_future VALUES LESS THAN MAXVALUE
);查询时只扫描相关分区,如 WHERE order_date >= '2025-01-01' 只访问 p2025 分区。
2. LIST 分区(枚举值)
CREATE TABLE user_logs (
id INT,
region VARCHAR(20)
) PARTITION BY LIST (region) (
PARTITION p_east VALUES IN ('BJ','SH','SZ'),
PARTITION p_west VALUES IN ('CD','CQ')
);3. HASH 分区(均匀分布)
CREATE TABLE logs (
id INT,
msg TEXT
) PARTITION BY HASH(id) PARTITIONS 8;4. 分区管理
-- 添加 RANGE 分区
ALTER TABLE orders ADD PARTITION (PARTITION p2026 VALUES LESS THAN (2027));
-- 删除分区(快速清理历史)
ALTER TABLE orders DROP PARTITION p2023;
-- 查看分区信息
SELECT * FROM information_schema.PARTITIONS WHERE TABLE_NAME = 'orders';建议单表超过 50GB 或 5000 万行时考虑分区。
