MySQL分区表是将一张逻辑上的大表,按照预设的规则拆分到多个独立的物理存储单元中的技术方案,拆分后的每个单元称为分区,所有分区组合起来对外呈现为一张完整的表,用户查询时无需感知分区的存在,数据库会自动定位到对应的分区获取数据。

分区表的核心优势
分区表相比普通大表主要有几个明显的优势:
- 提升查询效率:查询时如果带有分区键条件,数据库可以跳过无关分区,只扫描目标分区的数据,减少扫描范围。
- 简化数据维护:删除历史数据时可以直接删除整个分区,比逐行删除效率高很多,也不容易产生大量碎片。
- 均衡存储压力:可以将不同分区放到不同的磁盘上,分散存储和IO压力。
常见的分区类型
RANGE分区
RANGE分区是按照分区键的连续范围来划分分区的,适合按照时间、数值范围等连续维度拆分数据的场景,比如按照订单创建时间拆分订单表。
创建RANGE分区表的示例如下:
-- 创建按照订单创建时间分区的订单表
CREATE TABLE order_info (
order_id INT NOT NULL,
user_id INT NOT NULL,
order_amount DECIMAL(10,2),
create_time DATE NOT NULL
)
PARTITION BY RANGE (YEAR(create_time)) (
PARTITION p2020 VALUES LESS THAN (2021),
PARTITION p2021 VALUES LESS THAN (2022),
PARTITION p2022 VALUES LESS THAN (2023),
PARTITION p_max VALUES LESS THAN MAXVALUE
);
LIST分区
LIST分区是按照分区键的离散值集合来划分分区的,适合按照类别、地区等离散维度拆分数据的场景,比如按照用户所属地区拆分用户表。
创建LIST分区表的示例如下:
-- 创建按照用户所属地区分区的用户表
CREATE TABLE user_info (
user_id INT NOT NULL,
user_name VARCHAR(50),
region VARCHAR(20) NOT NULL
)
PARTITION BY LIST (region) (
PARTITION p_east VALUES IN ('上海','江苏','浙江'),
PARTITION p_south VALUES IN ('广东','福建','海南'),
PARTITION p_north VALUES IN ('北京','天津','河北'),
PARTITION p_other VALUES IN (DEFAULT)
);
HASH分区
HASH分区是对分区键做哈希运算后,根据哈希结果分配到不同的分区,适合希望数据均匀分布到各个分区的场景,分区数量一般是2的幂次。
创建HASH分区表的示例如下:
-- 创建按照用户ID哈希分区的用户扩展信息表
CREATE TABLE user_extend (
user_id INT NOT NULL,
extend_key VARCHAR(50),
extend_value VARCHAR(200)
)
PARTITION BY HASH (user_id)
PARTITIONS 4;
KEY分区
KEY分区和HASH分区类似,但是哈希函数由MySQL内部提供,支持除了BLOB、TEXT之外的所有类型的分区键,使用起来更灵活。
创建KEY分区表的示例如下:
-- 创建按照用户手机号KEY分区的用户联系方式表
CREATE TABLE user_contact (
user_id INT NOT NULL,
phone VARCHAR(20) NOT NULL,
email VARCHAR(100)
)
PARTITION BY KEY (phone)
PARTITIONS 4;
分区表的管理操作
添加分区
RANGE分区可以添加新的分区,LIST分区如果要添加的值不在现有分区中也可以新增分区:
-- 给order_info表添加新的2023年分区 ALTER TABLE order_info ADD PARTITION (PARTITION p2023 VALUES LESS THAN (2024));
删除分区
删除分区会同时删除分区内的所有数据,操作前需要确认数据是否需要备份:
-- 删除order_info表的2020年分区 ALTER TABLE order_info DROP PARTITION p2020;
合并分区
可以将相邻的两个RANGE分区合并成一个:
-- 合并order_info表的p2021和p2022分区
ALTER TABLE order_info REORGANIZE PARTITION p2021,p2022 INTO (
PARTITION p2021_2022 VALUES LESS THAN (2023)
);
使用分区表的注意事项
- 分区键必须是主键或者唯一索引的一部分,否则无法创建分区表。
- 分区表的分区数量不是越多越好,过多的分区会增加元数据管理的开销,反而降低性能。
- 只有查询条件中包含分区键时,才能触发分区裁剪,否则会扫描所有分区,性能可能比普通表还差。
- 分区表不支持外键约束,如果有外键关联需求不建议使用分区表。
- 不同分区最好放到不同的物理磁盘上,才能最大程度发挥分区表的IO分散优势。
分区表并不是万能的优化方案,只有当表的数据量达到千万级别以上,且查询场景符合分区规则时,才能体现出明显的性能优势,小表使用分区表反而会增加额外的管理成本。
MySQL分区表range_partitioninglist_partitioninghash_partitioning修改时间:2026-06-24 02:42:28