前言
在前面的内容中,【SQL应知应会】表分区(一)• MySQL版、【SQL应知应会】表分区(二)• MySQL版、【SQL应知应会】表分区(三)• MySQL版中,已经完成了MySQL的表分区方面的大部分知识的学习,如为什么对表进行分区,分区有哪些形式,分区有哪些类型以及每一种类型的语句,分区的注意事项以及适用场景,并且用例子代码演示了MySQL的各种分区
今天这篇内容,将继续进行讲述MySQL的表分区的后续内容,主要包括常见的分区操作,如删除分区、增加分区、分解分区、合并分区、重新定义分区、重建分区、 检查分区、修补分区,不但使用代码进行演示,并且补充了一些需要注意的内容;今天还讲到了MySQL分区表的局限性,其中直接使用错误示例帮助大家更直接明了的看到错误的原因,并且展示了错误修正后的代码
希望文章的内容对大家有所帮助,如果有什么不足的地方,大家可以在评论区或者私信我,感谢大家的支持
那么,快拿出你的电脑,跟着文章一起学习起来吧
一、分区表
1.非分区表
👉:传送门💖非分区表构💖
2.分区表
2.1 概念
👉:传送门💖概念💖
2.2 MySQL数据库表分区
2.2.1 InnoDB 逻辑存储结构
👉:传送门💖InnoDB 逻辑存储结构💖
2.2.2 段(segment)
2.2.3 区(extent)
2.2.4 页(page)
2.3 MySQL数据库分区的由来
👉:传送门💖MySQL数据库分区的由来💖
2.4 为什么对表进行分区?
👉:传送门💖为什么对表进行分区💖
2.4.1 表分区要解决的问题
2.4.2 表分区有如下优点
2.5 MySQL的分区形式
👉:传送门💖MySQL的分区形式💖
2.5.1 水平分区(HorizontalPartitioning)
2.5.2 垂直分区(VerticalPartitioning)
2.6 MySQL分区的类型
2.6.1 range分区 👉:传送门💖range分区💖
2.6.2 list分区(列表分区)
2.6.3 hash分区
2.6.4 KEY表分区
2.6.5 多字段分区(range、list)
2.6.6 分区注意事项及适用场景
👉:传送门💖2.6.2 ~ 2.6.6💖
2.7 MySQL分区代码
2.7.1range分区
2.7.2list分区
👉:传送门💖2.7.1~ 2.7.2💖
2.7.3 hash表分区
2.7.4 key表分区
2.7.5复合分区
2.7.5.1 range-hash(范围哈希)复合分区
2.7.5.2 list-hash(列表哈希)复合分区
👉:传送门💖2.7.3 ~ 2.7.5💖
2.7.5.3 range-key 复合分区
## range-key 复合分区 create table foo_emp2 ( empno varchar(20) not null, empname varchar(20), deptno int, salary int ) partition by range(salary) subpartition by key(deptno) subpartitions 3 ( partition p1 values less than (2000), partition p2 values less than (3000) ) insert into foo_emp2 select 1,1,20,1000 from dual
2.7.5.4 list - key 复合分区
## list - key 复合分区
create table empk( empno varchar(20) not null, empname varchar(20), deptno int, birthdate date not null, salary int ) partition by list(deptno) subpartition by key(birthdate) subpartitions 3 ( partition p1 values in (10), partition p2 values in (20) )
2.8 常见分区操作
2.8.1 删除分区
alter table emp drop partition p1 ## 不能删除hash或者key分区
一次性删除多个分区
alter table emp drop partition p1,p2
删除表的所有分区
alter table emp remove partitioning; -- 不会丢失数据
2.8.2 增加分区
增加范围分区
范围分区一般只能往后增加,往前增加一般得reorganize重新组织分区或者Oracle的split分区
### 范围分区一般只能往后增加,往前增加一般得reorganize重新组织分区或者Oracle的split
分区 alter table emp add partition(partition 3 values less than (4000)) -- 增加完4000的,是否可以增加一个3500? -- 不可以,因为4000之前的已经划分完了
增加列表分区
alter table emp1 add partition(partiton 3 value in (40)) -- 如果前面的list分区中,主分区有3个子分区,那么新增加的这个也会自动给配3个子分区
2.8.3 分解分区
Reorganize partition关键字可以对表的部分分区或全部分区进行修改,并且不会丢失数据
分解前后分区的整体范围应该一致
alter table te reorignize partition p1 into ( partition p1 values less than (100), partition p3 values less than (1000) ); -- 不会丢失数据
2.8.4 合并分区
alter table te reorganize partition p1,p3 into ( partition p1 values less than (1000) ) -- 不会丢失数据
2.8.5 重新定义分区
重新定义hash分区表
alter table emp partition by hash(salary) partitions 7; -- 不会丢失数据
重新定义range分区表
alter table emp partition by range(salary) ( partition p1 values less than (2000), partition p2 values less than (4000) ) -- 不会丢失数据
2.8.6 重建分区
这和先删除保存在分区中的所有记录,然后重新插入它们,具有同样的效果
可用于整理分区碎片
alter table emp rebuild partition p1,p2;
2.8.7 检查分区
可以使用几乎与对非分区表使用check table相同的方式检查分区
这个命令可以告知表emp的分区p1,p2中的数据或索引是否已经被破坏,若发生了这种情况,使用修补命令
alter table emp check partition p1,p2;
2.8.8 修补分区
# 修补被破坏的分区 alter table emp repairpartition p1,p2
2.9 MySQL分区表的局限性
在5.1版本中分区表对唯一约束有明确的规定,每一个唯一约束必须包含中分区表的分区键(也包括主键约束)
2.9.1 错误示例
报错:MySQL Database Error:A PRIMARY KEY must include allcolums in the tables partitioning function
create table emptt( empno varchar(20) not null, empname varchar(20), deptno int, birthdate date not null, salary int, primary key(empno) ) partition by range(salary) -- 这样的语句会出错:MySQL Database Error:A PRIMARY KEY must include allcolums in the tables partitioning function ( partition p1 values less than (100), partition p2 values less than (200) )
2.9.2 错误修正
create table emptt( empno varchar(20) not null, empname varchar(20), deptno int, birthdate date not null, salary int, primary key(empno,salary) -- 在主键中加入salary列就正常 ) partition by range(salary) ( partition p1 values less than (100), partition p2 values less than (200) )
小结
感谢大家耐心的看完这篇文章,对于SQL在表分区的知识点,我们在MySQL方面已经有四篇内容了,如果大家觉着还算可以,那么就给个三连支持一下吧,如果想要继续关注和学习后续更多的内容,就关注一下爱书不爱输的程序猿吧,当然,如果大家还有什么其他方面的知识点想要看,可以在评论区或者私信我