MySQL 分区是一种将大型表分割为更小、更易管理的部分的技术,逻辑上仍是一个表,但物理上数据分散存储。分区可以提高查询性能、简化数据维护,尤其适合大型表(千万级以上记录)。
-
提高查询效率:只扫描相关分区,无需全表扫描
-
便于数据管理:可单独备份 / 删除某个分区
-
提升可用性:一个分区故障不影响其他分区
-
优化存储:不同分区可存储在不同介质
按连续的范围值分区,适用于时间序列数据等。
CREATE TABLE orders (
id INT,
order_date DATE,
amount DECIMAL(10,2)
)
PARTITION BY RANGE (YEAR(order_date)) (
PARTITION p2020 VALUES LESS THAN (2021),
PARTITION p2021 VALUES LESS THAN (2022),
PARTITION p2022 VALUES LESS THAN (2023),
PARTITION p2023 VALUES LESS THAN MAXVALUE
);
按离散的值列表分区,适用于固定分类数据。
CREATE TABLE users (
id INT,
name VARCHAR(50),
region_code INT
)
PARTITION BY LIST (region_code) (
PARTITION p_north VALUES IN (1),
PARTITION p_east VALUES IN (2),
PARTITION p_south VALUES IN (3),
PARTITION p_west VALUES IN (4)
);
按哈希函数结果均匀分布数据,适合分散负载。
CREATE TABLE products (
id INT,
name VARCHAR(100),
price DECIMAL(10,2)
)
PARTITION BY HASH (id)
PARTITIONS 4;
类似哈希分区,但使用 MySQL 内部哈希函数。
CREATE TABLE customers (
id INT,
name VARCHAR(50),
email VARCHAR(100)
)
PARTITION BY KEY (name)
PARTITIONS 8;
ALTER TABLE orders
ADD PARTITION (PARTITION p2024 VALUES LESS THAN (2025));
ALTER TABLE users
ADD PARTITION (PARTITION p_foreign VALUES IN (0));
ALTER TABLE orders
DROP PARTITION p2020;
ALTER TABLE orders
REORGANIZE PARTITION p2021, p2022 INTO (
PARTITION p2021_2022 VALUES LESS THAN (2023)
);
SELECT PARTITION_NAME, TABLE_ROWS
FROM INFORMATION_SCHEMA.PARTITIONS
WHERE TABLE_NAME = 'orders';
-
分区键必须是表中的一列或表达式,且与数据类型匹配
-
所有分区必须使用相同的存储引擎
-
主键 / 唯一索引必须包含分区键
-
过多分区可能影响性能,需合理规划数量
-
不是所有存储引擎都支持分区(InnoDB 支持,MyISAM 有限支持)
-
分区适用于大数据量表,小表使用分区可能适得其反
合理使用分区可以显著提升大型数据库的性能和可维护性,应根据数据特征选择合适的分区策略。