mysql基础(四)表分区

发布时间:2026/10/29 12:11:16

mysql基础(四)表分区 目录1.range(范围分区)2.list列表分区3.hash4.key分区表分区就是把一张表分成若干小表管理起来更方便。MySQL 主要的分区策略包括 RANGE、LIST、HASH、KEYLINEAR HASH / LINEAR KEY 属于线性变体另外还有 RANGE COLUMNS、LIST COLUMNS以及 RANGE/LIST 基础上的子分区。1.range(范围分区)建立表的同时按区域类型range分区以字段age做为分区键共三个分区年龄范围20以内的为年轻年龄40以内为中年最大年龄以内为老年。输入语句执行CREATETABLErg(idINT,ageINT)PARTITIONBYRANGE(age)(PARTITIONmiddleVALUESLESS THAN(40),PARTITIONyoungVALUESLESS THAN(20),PARTITIONOLDVALUESLESS THAN maxvalue)结果报错根据错误提示必须要根据取值范围递增也就是要按顺序取值。上面的语句是先取40以内再取20以内就是这两句:PARTITIONmiddleVALUESLESS THAN(40),PARTITIONyoungVALUESLESS THAN(20),顺序改过来再执行CREATETABLErg(idINT,ageINT)PARTITIONBYRANGE(age)(PARTITIONyoungVALUESLESS THAN(20),PARTITIONmiddleVALUESLESS THAN(40),PARTITIONOLDVALUESLESS THAN maxvalue)执行成功查看分区SELECT*FROMinformation_schema.PARTITIONSWHEREtable_namerg结果如下图貌似系统自动根据分区名排序了可以加上ORDER BY partition_ordinal_position按分区顺序排序SELECT*FROMinformation_schema.PARTITIONSWHEREtable_namergORDERBYpartition_ordinal_position结果如图三个分区一目了然。分别查看指定分区SELECT*FROMrgPARTITION(young)SELECT*FROMrgPARTITION(middle)SELECT*FROMrgPARTITION(OLD)结果分别如下图删除old分区ALTERTABLErgDROPPARTITIONOLD再次查看表分区SELECT*FROMinformation_schema.PARTITIONSWHEREtable_namergORDERBYpartition_ordinal_position查询结果可知删除成功添加分区ALTERTABLErgADDPARTITION(PARTITIONlaonianVALUESLESS THAN(60))再次查看表的分区信息SELECT*FROMinformation_schema.PARTITIONSWHEREtable_namergORDERBYpartition_ordinal_position添加成功。删除young分区中的数据不是删除分区ALTERTABLErgTRUNCATEPARTITIONyoung查看对young区进行拆分ALTERTABLErg REORGANIZEPARTITIONyoungINTO(PARTITIONs1VALUESLESS THAN(10),PARTITIONs2VALUESLESS THAN(20))执行结果对middle和laonian两个分区进行合并ALTERTABLErg REORGANIZEPARTITIONmiddle,laonianINTO(PARTITIONadultVALUESLESS THAN(60))输入查询分区语句SELECT*FROMinformation_schema.PARTITIONSWHEREtable_namergORDERBYpartition_ordinal_position结果range中less than(x)是取值范围所以括号中的数字x不能为空否则会报错。range还支持日期型的字段这里不做演示。2.list列表分区list和range极其类似不同的是list是从枚举列表中取值而range是从连续区间集合中取值。下面创建一张表以YEAR(days)为分区键进行list分区将日期转换成年后分为单年、双年和未知三个分区。CREATETABLElt(idINT,daysDATE)PARTITIONBYLIST(YEAR(days))(PARTITIONdannianVALUESIN(2011,2013,2015,2017,2019),PARTITIONshuangnianVALUESIN(2012,2014,2016,2018,2020),PARTITIONweizhiVALUESIN(NULL))输入查询分区语句SELECT*FROMinformation_schema.PARTITIONSWHEREtable_nameltORDERBYpartition_ordinal_position结果如图可以看出List分区是没有顺序的不像range分区从上往下按顺序递增。插入数据INSERTINTOltVALUES(1,2011-11-8),(2,NULL),(3,2018-10-9),(4,2016-01-05),(7,2015-03-15),(8,2020-01-03)查看分区数据SELECT*FROMltPARTITION(dannian)SELECT*FROMltPARTITION(shuangnian)SELECT*FROMltPARTITION(weizhi)依次执行结果如下list字段值不能在所有分区枚举值之外例如执行如下语句INSERTINTOltVALUES(9,2021-1-3)执行结果报错提示表中没有值为2021的分区因为枚举值是2011-2020,还有空值Null不包含2021所以报错。这一点要注意。分区字段的数据类型MySQL 的分区语法决定了字段类型的选择主要分为两种情况使用 RANGE 或 LIST 分区时分区表达式必须产生整数INTEGER或 NULL 值。如果要对日期分区通常需要借助 YEAR()、TO_DAYS() 等函数将日期转换为整数。使用 RANGE COLUMNS 或 LIST COLUMNS 分区时MySQL 5.5 支持可以直接使用非整数类型的列作为分区键。支持的类型主要包括所有整数类型DATE 和 DATETIME 类型部分字符串类型CHAR、VARCHAR、BINARY、VARBINARY注意DECIMAL 或 FLOAT 等浮点数类型不支持作为 COLUMNS 分区的列。3.hashHASH分区主要用来确保数据在预先确定数目的分区中平均分布。在RANGE和LIST分区中必须明确指定一个给定的列值或列值集合应该保存在哪个分区中而在HASH分区中MySQL 自动完成这些工作你所要做的只是基于将要被哈希的列值指定一个列值或表达式以及指定被分区的表将要被分割成的分区数量。创建过程如下CREATETABLEhs(idINT,daysDATE)PARTITIONBYHASH(YEAR(days))PARTITIONS4;创建分区时不用指定具体取值只要指定分区数量就行如果不指定默认值分区数量为1。查询分区SELECT*FROMinformation_schema.PARTITIONSWHEREtable_namehsORDERBYpartition_ordinal_position结果是按指定分区数4分区的。插入数据INSERTINTOhsVALUES(1,2011-11-8),(2,NULL),(3,2018-10-9),(4,2016-01-05),(7,2015-03-15),(8,2020-01-03)依次查询4个分区SELECT*FROMhsPARTITION(p0)SELECT*FROMhsPARTITION(p1)SELECT*FROMhsPARTITION(p2)SELECT*FROMhsPARTITION(p3)hash的分区原理是mod函数对分区键对应的字段或表达式值与分区数量的求余运算即mod(分区键对应列值表达式值分区数量)也就是modyear(days),4。可以拿分在p0区的days2016-01-05’测试执行如下语句SELECTMOD(YEAR(2016-01-15),4)注因为YEAR(‘2016-01-15’)2016所以MOD(YEAR(‘2016-01-15’),4)语句等同于mod(2016,4)。结果再拿分在p2区的2018-10-9进行测试SELECTMOD(YEAR(2018-10-9),4)返回结果null值取余运算也是null当成0分配在p0区也是理所当然了。尝试删除分区ALTERTABLEhsDROPPARTITIONp3结果报错删除分区只能在range和list分区使用。以上是常规哈希还有线性哈希分区。这是官方文档说明MySQL还支持线性哈希功能它与常规哈希的区别在于线性哈希功能使用的一个线性的2的幂powers-of-two运算法则而常规 哈希使用的是求哈希函数值的模数。线性哈希分区和常规哈希分区在语法上的唯一区别在于在“PARTITION BY” 子句中添加“LINEAR”关键字如下所示CREATETABLEline(idINT,daysDATE)PARTITIONBYLINEARHASH(YEAR(days))PARTITIONS4;执行后查看SELECT*FROMinformation_schema.PARTITIONSWHEREtable_nameline插入数据INSERTINTOlineVALUES(1,2011-11-8),(2,NULL),(3,2018-10-9),(4,2016-01-05),(7,2015-03-15),(8,2020-01-03)依次查询SELECT*FROMlinePARTITION(p0)SELECT*FROMlinePARTITION(p1)SELECT*FROMlinePARTITION(p2)SELECT*FROMlinePARTITION(p3)结果分别如下线性哈希算法找到下一个大于num.的、2的幂我们把这个值称为V 它可以通过下面的公式得到V POWER(2, CEILING(LOG(2, num)))例如假定num是13。那么LOG(2,13)就是3.7004397181411。 CEILING(3.7004397181411)就是4则V POWER(2,4), 即等于16。设置 N F(column_list) (V - 1).当 N num:· 设置 V CEIL(V / 2)· 设置 N N (V - 1)注num是分区数量拿p0中的days2016-01-05进行测试执行SELECTPOWER(2,CEILING(LOG(2,4)))求得V4NF(column_list) (V - 1)year(2015-03-15) (4-1)2016 3执行SELECT20163返回结果0再拿p3区的2015进行测试直接执行SELECT20153结果为3以上几张分区表都没有主键或者唯一约束不妨建一张测试效果CREATETABLENEW(idINTPRIMARYKEY,daysDATE)PARTITIONBYLINEARHASH(YEAR(days))PARTITIONS4;结果报错分区改成常规hashCREATETABLENEW(idINTPRIMARYKEY,daysDATE)PARTITIONBYHASH(YEAR(days))PARTITIONS4;还是报同样的错再试试range分区CREATETABLENEW(idINTPRIMARYKEY,daysDATE)PARTITIONBYRANGE(YEAR(days))(PARTITIONp1VALUESLESS THAN(2015),PARTITIONp2VALUESLESS THAN(2010))依然报错A PRIMARY KEY must include all columns in the table’s partitioning function难道是主键的问题再试试List分区把主键约束改成唯一约束CREATETABLENEW(idINTUNIQUE,daysDATE)PARTITIONBYLIST(YEAR(days))(PARTITIONp1VALUESIN(2015),PARTITIONp2VALUESIN(2010))还是报错这是为什么呢根据报错信息A PRIMARY KEY must include all columns in the table’s partitioning主键必须包括表的分区函数中的所有列。A UNIQUE INDEX must include all columns in the table’s partitioning function惟一的索引必须包括表的分区函数中的所有列。接下来分别以主键和唯一约束字段做为分区键CREATETABLENEW(idINTPRIMARYKEY,daysDATE)PARTITIONBYLIST(id)(PARTITIONp1VALUESIN(2,4),PARTITIONp2VALUESIN(1,3))CREATETABLEnew1(idINTUNIQUE,daysDATE)PARTITIONBYLIST(id)(PARTITIONp1VALUESIN(2,4),PARTITIONp2VALUESIN(1,3))两张表都创建成功原来在表中有主键约束的时候必须以主键字段为分区键有唯一约束的时候同样以唯一约束字段做为分区键。那么假设一张表中主键约束和唯一约束同时存在如何分区呢继续测试先以主键约束字段为分区键CREATETABLEnew2(idINTPRIMARYKEY,cidINTUNIQUE,daysDATE)PARTITIONBYLIST(id)(PARTITIONp1VALUESIN(2,4),PARTITIONp2VALUESIN(1,3))执行结果那么试下用唯一约束字段做为分区键CREATETABLEnew2(idINTPRIMARYKEY,cidINTUNIQUE,daysDATE)PARTITIONBYLIST(cid)(PARTITIONp1VALUESIN(2,4),PARTITIONp2VALUESIN(1,3))执行结果可以这样讲分区表达式中使用到的所有列必须包含在表的每一个 UNIQUE KEY 中PRIMARY KEY 本身也是一种 UNIQUE KEY所以同样必须包含这些分区列。如下例CREATETABLEnew2(idINT,cidINT,daysDATE,PRIMARYKEY(id),UNIQUE(id,cid))PARTITIONBYLIST(id)(PARTITIONp1VALUESIN(2,4),PARTITIONp2VALUESIN(1,3))分区键id既是主键又属于唯一约束中的一个字段可以说它能代表两者执行成功4.key分区与hash类似区别在于key可以不用指定分区键在表中主键和唯一键同时存在的情况下会自动选用兼具两种约束的字段也就是在前面所说的代表做为分区键如下图id是主键也是唯一键CREATETABLEnew4(idINT,cidINTNOTNULL,daysDATE,PRIMARYKEY(id),UNIQUE(cid,id))PARTITIONBYKEY()PARTITIONS4;上述情况只有唯一键是复合键如果主键和唯一键都是复合键并且里面字段多的情况下不手动指定分区键容易报错。表中只存在主键情况下会自动选择主键做为分区键CREATETABLEnew5(idINT,cidINTNOTNULL,daysDATE,PRIMARYKEY(id))PARTITIONBYKEY()PARTITIONS4;没有主键情况下选择唯一键做为分区键CREATETABLEnew6(idINT,cidINTNOTNULL,daysDATE,UNIQUE(cid))PARTITIONBYKEY()PARTITIONS4;但是唯一键必须是非空不然报错如下所示CREATETABLEnew7(idINT,cidINT,daysDATE,UNIQUE(cid))PARTITIONBYKEY()PARTITIONS4;只是少了个not null就建表失败这种情况下要么在唯一键字段加上not null要么手动指定分区键如下CREATETABLEnew7(idINT,cidINT,daysDATE,UNIQUE(cid))PARTITIONBYKEY(cid)PARTITIONS4;手动指定了分区键cid执行成功。5.子分区子分区是分区表中每个分区的再次分割可以用于特别大的表在多个磁盘间分配数据和索引。创建过程如下CREATETABLEnew9(idINT,daysDATE)PARTITIONBYRANGE(YEAR(days))SUBPARTITIONBYHASH(TO_DAYS(days))SUBPARTITIONS2(PARTITIONp1VALUESLESS THAN(2010),PARTITIONp2VALUESLESS THAN(2015),PARTITIONp3VALUESLESS THAN(2020))查看分区查看结果显示共有三个大分区p1、p2、p36个小分区也就是建立了三个range分区而每个range分区下有2个hash小分区小分区只指定了数量自动生成的所以名字默认就像一个二维数组int[3][2].也可以指定具体子分区表名如下CREATETABLEnew10(idINT,daysDATE)PARTITIONBYRANGE(YEAR(days))SUBPARTITIONBYHASH(TO_DAYS(days))(PARTITIONp1VALUESLESS THAN(2010)(SUBPARTITION s1,SUBPARTITION s2),PARTITIONp2VALUESLESS THAN(2015)(SUBPARTITION s3,SUBPARTITION s4),PARTITIONp3VALUESLESS THAN(2020)(SUBPARTITION s5,SUBPARTITION s6))查询分区注意每个大分区里的小分区数量必须是相同的所以指定具体的小分区时必须要写完整像下面这样是会报错的CREATETABLEnew11(idINT,daysDATE)PARTITIONBYRANGE(YEAR(days))SUBPARTITIONBYHASH(TO_DAYS(days))(PARTITIONp1VALUESLESS THAN(2010)(SUBPARTITION s1,SUBPARTITION s2),PARTITIONp2VALUESLESS THAN(2015)(SUBPARTITION s3,SUBPARTITION s4),PARTITIONp3VALUESLESS THAN(2020))还有用来分小区的是subpartition,指定小区数量的是subpartitions不要拼错。
延伸阅读

更多相关文章

2026/10/24 14:21:32

用SQL管理智能体会话记忆:从表结构到生产落地

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/24 13:42:53

游戏服务器安全测试:DDoS防护与反作弊机制本地验证指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/29 12:10:23

LLVM如何提升数据库性能:从解释执行到原生编译

1. 为什么数据库需要LLVM?从解释执行到原生编译的进化 十年前我第一次接触数据库内核开发时,发现大多数查询还是走解释执行的路径。每条SQL语句被解析成语法树后,通过火山模型(Volcano Model)一行行处理,这…

2026/10/29 12:10:23

ISO 15118-20 深度解析:V2G 通信协议栈与充电会话状态机

简介:ISO 15118-20:2022是国际标准化组织发布的道路车辆与电网通信接口标准,聚焦第二代网络层与应用层要求,面向电动汽车充电协议开发者、车载通信工程师及充电设施设计人员,用于解决不同品牌车辆与充电桩之间的互操作与安全通信问…

2026/10/29 12:10:23

Servlet技术深度解析与JavaWeb开发实战

1. Servlet技术深度解析与实战应用在JavaEE企业级开发领域,Servlet作为最基础的Web组件已经存在了二十余年。虽然现在各种框架层出不穷,但理解Servlet的工作原理仍然是每个JavaWeb开发者的必修课。最近在指导团队新人时发现,很多开发者虽然能…

2026/10/29 12:10:23

技术人才薪资倒挂现象解析与应对策略

1. 薪资倒挂现象的本质解析第一次在团队里看到新人的工资单比老员工高30%时,我盯着Excel表格反复核对了三遍。这不是个例,过去两年我经手的47个招聘案例中,有29个出现了薪资倒挂,最夸张的一个前端岗位,三年经验的老员工…

2026/10/29 12:10:23

Vue3中二次封装v-loading指令的实践与优化

1. 为什么需要二次封装v-loading指令在Vue3ElementPlus的项目开发中,v-loading指令是使用频率极高的一个功能组件。它能够为指定区域添加加载状态,提升用户体验。但原生指令在实际业务场景中往往存在以下痛点:样式定制困难:Elemen…

2026/10/29 12:05:22

信号与系统知识地图:三层响应驱动的时频域分析框架

简介:本资源是一份面向电子信息类专业本科生与考研学生的《信号与系统》核心考点精要复习文档,聚焦课程重难点突破与应试梳理。全文系统覆盖信号分类与典型奇异信号(阶跃、冲激及其性质)、时域运算(移位、反褶、尺度变…

2026/10/28 14:42:12

全国计算机二级C语言真题PDF高效刷题指南

简介:这份PDF是全国计算机二级C语言考试的试题与答案解析,专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/28 15:28:56

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介:一份以实战为导向的Python爬虫入门资源,面向具备基本编程基础、希望快速掌握网络数据抓取的初学者,可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档,完整演示从网页中提取 标题…

2026/10/28 3:32:29

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介:这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档,压缩包大小七十八KB,内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开:先构造一个极点位于单位圆内…

2026/10/29 0:03:42

学生选课系统DFD图绘制指南:边界划分与分层校验实战

简介:文档以顶层与第一层DFD图为核心,完整刻画学生选课系统的逻辑模型,面向软件工程课程设计、系统分析学习及毕设前期建模人群。顶层图界定系统边界,外部实体包括管理员、教师和学生三类角色;第一层图进一步细化用户登…

2026/10/29 0:03:42

JIRA敏捷落地:Scrum角色权限、Sprint与燃尽图避坑指南

简介:围绕“基于JIRA的敏捷开发项目管理”这一主题,面向产品负责人、Scrum Master及研发测试成员,梳理Scrum角色分工、迭代流程与JIRA工具配置的对应关系,适合初、中级团队导入敏捷管理时参考。压缩包共1个docx文件,大…

2026/10/29 0:03:42

SEMI S8人机工程验收实战:从条款拆解到现场实测的完整指南

简介:面向半导体设备设计、制造与运维工程师及安全合规人员,这份资料聚焦SEMI标准体系下的设备安全规范,重点收录SEMI S8-0308《半导体制造设备人体工程学工程安全指南》。内容围绕设备设计原则、错误与事故预防、人体工程学适配三大主线展开…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑