导读:本期聚焦于小伙伴创作的《MySQL分区表子分区如何创建?分区字段录入Null值会怎么处理?》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《MySQL分区表子分区如何创建?分区字段录入Null值会怎么处理?》有用,将其分享出去将是对创作者最好的鼓励。

MySQL分区表除了基础的分区策略外,还支持子分区功能,同时分区字段录入Null值时的处理逻辑也需要开发者提前了解,避免线上业务出现数据分布异常的问题。

MySQL分区表子分区如何创建?分区字段录入Null值会怎么处理?

MySQL子分区的概念与创建方式

子分区又称为复合分区,是在已经分区的基础表上,对每个分区再次进行分区划分的操作。MySQL目前仅支持对RANGELIST类型的分区创建子分区,子分区的类型通常为HASH或者KEY分区。

创建带有子分区的表时,需要在分区定义中额外指定子分区的数量和规则。以下是一个范围分区加哈希子分区的示例:

-- 创建订单表,按订单年份做范围分区,每个范围分区下按用户ID做哈希子分区
CREATE TABLE order_info (
    order_id INT NOT NULL,
    user_id INT NOT NULL,
    order_year INT NOT NULL,
    order_amount DECIMAL(10,2),
    PRIMARY KEY (order_id, order_year, user_id)
)
PARTITION BY RANGE (order_year)
SUBPARTITION BY HASH (user_id)
SUBPARTITIONS 3 (
    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
);

上述语句中,首先按照order_year字段做范围分区,划分出2020年、2021年、2022年和最大值的四个分区,之后每个分区下再按照user_id做哈希子分区,每个主分区下会有3个子分区,最终表会生成12个物理分区文件。

子分区的使用注意事项

  • 子分区的字段必须是主键或者唯一索引的一部分,否则创建表时会报错,这是因为分区字段需要保证唯一性约束的校验。
  • 子分区的数量一旦确定,后续无法直接修改,如果需要调整子分区数量,需要重建整个分区表。
  • 子分区可以提升分区裁剪的效率,当查询条件同时命中主分区和子分区的字段时,MySQL可以跳过更多无关的分区文件,提升查询速度。

分区字段录入Null值的处理规则

实际业务中可能会遇到分区字段值为Null的情况,不同分区类型对Null值的处理逻辑不同,开发者需要根据业务场景选择合适的分区类型。

RANGE分区对Null值的处理

RANGE分区中,Null值会被当作最小值处理,会落到第一个分区中。例如上面的order_info表,如果插入一条order_year为Null的记录,这条记录会被存储到p2020分区中。

可以通过以下语句验证:

-- 插入order_year为Null的测试数据
INSERT INTO order_info (order_id, user_id, order_year, order_amount) VALUES (1, 100, NULL, 99.9);
-- 查看数据所在的分区
SELECT PARTITION_NAME, TABLE_ROWS 
FROM INFORMATION_SCHEMA.PARTITIONS 
WHERE TABLE_NAME = 'order_info' AND TABLE_SCHEMA = 'test_db';

执行后会发现p2020分区的行数增加了1,说明Null值被存储到了第一个范围分区中。

LIST分区对Null值的处理

LIST分区中,只有当分区定义明确包含Null值时,Null值才能被正常插入,否则插入会报错。例如创建如下LIST分区表:

-- 创建按状态分区的表,状态为1、2、3的分别存储到不同分区
CREATE TABLE task_info (
    task_id INT NOT NULL,
    task_status INT,
    task_name VARCHAR(50),
    PRIMARY KEY (task_id, task_status)
)
PARTITION BY LIST (task_status) (
    PARTITION p_status_1 VALUES IN (1),
    PARTITION p_status_2 VALUES IN (2),
    PARTITION p_status_3 VALUES IN (3)
);

此时如果插入task_status为Null的记录,会直接报错,因为没有任何分区定义包含Null值。如果需要支持Null值,需要在分区定义中添加VALUES IN (NULL)

-- 修改分区定义,添加支持Null值的分区
ALTER TABLE task_info ADD PARTITION (PARTITION p_status_null VALUES IN (NULL));

HASH和KEY分区对Null值的处理

HASHKEY分区中,Null值会被当作0来处理,参与哈希计算。例如按照用户ID做HASH分区时,如果用户ID为Null,会按照0的哈希结果分配到对应的分区中,不会报错。

线上修改分区字段的注意事项

如果需要线上修改分区字段,需要注意MySQL的分区表不支持直接修改分区字段的类型或者更换分区字段,只能通过重建表的方式实现。大致步骤如下:

  1. 创建新的分区表,使用目标分区字段和分区规则。
  2. 将旧表的数据迁移到新表中。
  3. 删除旧表,将新表重命名为旧表的名称。

迁移过程中如果需要处理Null值,需要根据新分区的类型提前做好兼容,避免数据迁移失败或者数据分布不符合预期。

注意:线上操作分区表修改时,建议在业务低峰期进行,并且提前做好数据备份,避免数据丢失。

MySQL_partition子分区分区字段Null值处理修改时间:2026-07-08 01:39:29

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。