【SQL应知应会】表分区(四)• MySQL版

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 【SQL应知应会】表分区(四)• MySQL版

前言

在前面的内容中,【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方面已经有四篇内容了,如果大家觉着还算可以,那么就给个三连支持一下吧,如果想要继续关注和学习后续更多的内容,就关注一下爱书不爱输的程序猿吧,当然,如果大家还有什么其他方面的知识点想要看,可以在评论区或者私信我


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
6天前
|
SQL 存储 缓存
MySQL进阶突击系列(02)一条更新SQL执行过程 | 讲透undoLog、redoLog、binLog日志三宝
本文详细介绍了MySQL中update SQL执行过程涉及的undoLog、redoLog和binLog三种日志的作用及其工作原理,包括它们如何确保数据的一致性和完整性,以及在事务提交过程中各自的角色。同时,文章还探讨了这些日志在故障恢复中的重要性,强调了合理配置相关参数对于提高系统稳定性的必要性。
|
4天前
|
SQL 关系型数据库 MySQL
MySQL 高级(进阶) SQL 语句
MySQL 提供了丰富的高级 SQL 语句功能,能够处理复杂的数据查询和管理需求。通过掌握窗口函数、子查询、联合查询、复杂连接操作和事务处理等高级技术,能够大幅提升数据库操作的效率和灵活性。在实际应用中,合理使用这些高级功能,可以更高效地管理和查询数据,满足多样化的业务需求。
21 3
|
7天前
|
SQL 关系型数据库 MySQL
MySQL导入.sql文件后数据库乱码问题
本文分析了导入.sql文件后数据库备注出现乱码的原因,包括字符集不匹配、备注内容编码问题及MySQL版本或配置问题,并提供了详细的解决步骤,如检查和统一字符集设置、修改客户端连接方式、检查MySQL配置等,确保导入过程顺利。
|
9天前
|
SQL 存储 关系型数据库
MySQL进阶突击系列(01)一条简单SQL搞懂MySQL架构原理 | 含实用命令参数集
本文从MySQL的架构原理出发,详细介绍其SQL查询的全过程,涵盖客户端发起SQL查询、服务端SQL接口、解析器、优化器、存储引擎及日志数据等内容。同时提供了MySQL常用的管理命令参数集,帮助读者深入了解MySQL的技术细节和优化方法。
|
10天前
|
SQL Oracle 关系型数据库
SQL(MySQL)
SQL语言是指结构化查询语言,是一门ANSI的标准计算机语言,用来访问和操作数据库。 数据库包括SQL server,MySQL和Oracle。(语法大致相同) 创建数据库指令:CRATE DATABASE websecurity; 查看数据库:show datebase; 切换数据库:USE websecurity; 删除数据库:DROP DATABASE websecurity;
|
3天前
|
关系型数据库 MySQL 数据库
Python处理数据库:MySQL与SQLite详解 | python小知识
本文详细介绍了如何使用Python操作MySQL和SQLite数据库,包括安装必要的库、连接数据库、执行增删改查等基本操作,适合初学者快速上手。
45 15
|
3天前
|
关系型数据库 MySQL 数据库
数据库数据恢复—MYSQL数据库文件损坏的数据恢复案例
mysql数据库文件ibdata1、MYI、MYD损坏。 故障表现:1、数据库无法进行查询等操作;2、使用mysqlcheck和myisamchk无法修复数据库。
|
15天前
|
关系型数据库 MySQL 数据库
GBase 数据库如何像MYSQL一样存放多行数据
GBase 数据库如何像MYSQL一样存放多行数据
|
27天前
|
SQL 关系型数据库 MySQL
12 PHP配置数据库MySQL
路老师分享了PHP操作MySQL数据库的方法,包括安装并连接MySQL服务器、选择数据库、执行SQL语句(如插入、更新、删除和查询),以及将结果集返回到数组。通过具体示例代码,详细介绍了每一步的操作流程,帮助读者快速入门PHP与MySQL的交互。
34 1
|
29天前
|
SQL 关系型数据库 MySQL
go语言数据库中mysql驱动安装
【11月更文挑战第2天】
39 4