详解MySQL分区表
发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,小编这次要给大家分享的是详解MySQL分区表,文章内容丰富,感兴趣的小伙伴可以来了解一下,希望大家阅读完这篇文章之后能够有所收获。前言在最近的项目中,我们需要保存大量的数据,而且这些数据是有有效期的,
千家信息网最后更新 2026年10月31日详解MySQL分区表
小编这次要给大家分享的是详解MySQL分区表,文章内容丰富,感兴趣的小伙伴可以来了解一下,希望大家阅读完这篇文章之后能够有所收获。
前言
在最近的项目中,我们需要保存大量的数据,而且这些数据是有有效期的,为了提供查询效率以及快速删除过期数据,我们选择了MySQL的分区机制。把数据按照时间进行分区。
分区类型
- Range分区:最为常用,基于属于一个给定连续区间的列值,把多行分配给分区。最常见的是基于时间字段. 基于分区的列最好是整型,如果日期型的可以使用函数转换为整型。
- List分区:LIST分区和RANGE分区类似,区别在于LIST是枚举值列表的集合,RANGE是连续的区间值的集合。
- Hash分区:基于给定的分区个数,将数据分配到不同的分区,HASH分区只能针对整数进行HASH,对于非整形的字段只能通过表达式将其转换成整数。
- Key分区:KEY分区其实跟HASH分区差不多,不同点如下:
- KEY分区允许多列,而HASH分区只允许一列。
- 如果在有主键或者唯一键的情况下,key中分区列可不指定,默认为主键或者唯一键,如果没有,则必须显性指定列。
- KEY分区对象必须为列,而不能是基于列的表达式。
- KEY分区和HASH分区的算法不一样,PARTITION BY HASH (expr),MOD取值的对象是expr返回的值,而PARTITION BY KEY (column_list),基于的是列的MD5值。
分区命令
创建分区
CREATE TABLE `access_log` ( `id` int(11) NOT NULL AUTO_INCREMENT, `access_time` datetime NOT NULL, PRIMARY KEY (`id`,`access_time`)) ENGINE=InnoDB DEFAULT CHARSET=utf8/*!50100 PARTITION BY RANGE (to_days(access_time))(PARTITION p1 VALUES LESS THAN (to_days(20190101)) ENGINE = InnoDB, PARTITION p2 VALUES LESS THAN (to_days(20190102)) ENGINE = InnoDB, PARTITION p3 VALUES LESS THAN (to_days(20190103)) ENGINE = InnoDB) */;
创建后可以看到,每个分区都会对应1个ibd文件
分区表
新增分区
alter table access_log add partition( partition p4 values less than (to_days('20190105')));删除分区
alter table access_log drop partition p1;
拆分分区
alter table access_log reorganize partition p4 into( -> partition s0 values less than(to_days('20190104')), -> partition s1 values less than(to_days('20190105')) -> );合并分区
alter table access_log reorganize partition s0,s1 into ( partition p4 values less than (to_days('20190105')) );注意事项
- MySQL分区中如果存在主键或唯一键,则分区列必须包含在其中(否则判断主键或唯一时,需要扫描所有分区)
- 分区字段不能为NULL,要不然怎么确定分区范围呢,所以尽量NOT NULL
- 最大分区数目不能超过1024
- 不支持外键
- 只能对数据表的整型列进行分区,或者数据列可以通过分区函数转化成整型列
- 分区表不影响自增列
常见问题
- A PRIMARY KEY must include all columns in the table's partitioning function:这样的话判断主键是否唯一就可以在单个分区内部完成,否则就需要跨所有的分区
- MAXVALUE can only be used in last partition definition:RANGE表分区后不能带MAXVALUE分区,否则无法增加分区。或者就只能重新分区了
alter table access_log partition by range(to_days(access_time))(partition p1 values less than (to_days('20191202')), partition p2 values less than (to_days('20191203')), partition po values less than (maxvalue))- Table has no partition for value 737425:因为分区的范围没有包含所有可能的记录的值
看完这篇关于详解MySQL分区表的文章,如果觉得文章内容写得不错的话,可以把它分享出去给更多人看到。
数据
分区表
字段
文章
不同
内容
函数
区间
对象
常见
整数
时间
范围
表达式
分配
不错
有效
可不
差不多
这样的话
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
广州万易互联网科技有限公司
互联网科技有限公司经营范围
互联网是不是新科技
西安互联网科技
远信互联网科技
善班互联网科技有限公司
互联网金融科技平台
汇久创客互联网科技
亿账通互联网科技
唐信互联网科技 大连
伴你行互联网科技有限公司
互联网科技公司名称
互联网公司会议桌创意科技软装饰
开启互联网科技时代小说
互联网汽车科技小镇
中化能源互联网科技招聘
互联网安防科技感
互联网科技融合创新
10位科技互联网大佬
互联网科技创业计划的风险分析
有格互联网科技
互联网 科技创新
电子科技大学互联网
长亮科技互联网金融
恒生科技互联网指数分析
现代科技和互联网有关系吗
武汉健翔互联网络科技有限公司
爱医互联网络科技
信承诺互联网科技有限公司
互联网科技企业商标注意事项