高性能 MySQL(十二):分区表

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群版 2核4GB 100GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用版 2核4GB 50GB
简介: 分区表是一个独立的逻辑表,其底层由多个物理子表组成。对分区表的请求,在 MySQL 底层都会被转换为对范围内的物理子表的请求,并将结果合并到一起返回。

image.png

❤️ 个人主页:水滴技术
🌸 订阅专栏:高性能 MySQL
🚀 支持水滴:点赞👍 + 收藏⭐ + 留言💬

大家好,我是水滴~~

分区表是一个独立的逻辑表,其底层由多个物理子表组成。对分区表的请求,在 MySQL 底层都会被转换为对范围内的物理子表的请求,并将结果合并到一起返回。

分区的一个主要目的是将数据按照一个较粗的粒度分在不同的表中,这样做可以将相关的数据存放在一起。在执行查询时,优化器会根据分区定义过滤掉那些没有我们需要数据的子表,这样,查询就无需扫描所有子表了(只会查找包含需要数据的子表)。

一、分区表的作用

分区表在下面场景中,起到非常大的作用:

表非常大以至于无法全部都放在内存中,或者只在表的最后部分有热点数据,其他均是历史数据。
分区表的数据更易维护。例如,可以对单独的子表进行优化、检查、修复等操作。
分区表的数据可以分布在不同的物理设备上,从而高效地复用多个硬件设备。
可以使用分区表来避免单表存在的瓶颈。
可以按照分区独立备份和恢复,这在大的数据集中有非常好的效果。

二、分区表的限制

分区表本身也有一些限制,下面是几个比较重要的点:

一个分区表最多只能有 1024 个分区(子表),从 MySQL5.6.7 开始,这个限制增加到了 8192 个。
在 MySQL5.1 中,分区表达式必须是整数,或者是返回整数的表达式。在 MySQL5.5中,某些场景中可以直接使用列来进行分区。
如果分区字段中有主键或者唯一索引的列,那么这些列都必须包含进来。
分区表中无法使用外键约束。

三、分区表的原理

分区表由多个相关的底层表实现,我们可以直接访问各个分区(子表)。存储引擎管理分区的各个子表和管理普通表一样(所有的子表必须使用相同的存储引擎),分区表的索引只是在各个子表上各自加上一个完全相同的索引。

分区表上各种操作的逻辑如下:

1. SELECT 查询

当对分区表执行查询时,分区层先打开并锁住所有子表,优化器先判断是否可以过滤部分子表,然后再调用对应的存储引擎接口访问过滤后的子表中的数据。

2. INSERT 操作

当向分区表中插入一条记录时,分区层先打开并锁住所有的子表,然后确定哪个分区接收这条记录,再将记录写入对应的子表。

3. DELETE 操作

当删除一条记录时,分区层先打开并锁住所有子表,然后确定数据对应的分区,最后对相应的子表进行删除操作。

4. UPDATE 操作

当更新一条记录时,分区层先打开并锁住所有子表,MySQL 先确定需要更新的记录在哪个分区,然后取出数据并更新,再判断更新后的数据应该放在哪个分区,最后对子表进行写入操作,并对原数据所在子表进行删除操作。

虽然每个操作都会“先打开并锁住所有子表”,但这并不是说分区表在处理过程中是锁住全表的。如果存储引擎能够自己实现行级锁,例如 InnoDB,则会在分区层释放对应表锁。这个加锁和解锁的过程与普通 InnoDB 上的查询类似。

四、分区表的类型

MySQL 支持多种分区表,我们看到最多的是根据范围进行分区,每个分区存储落在某个范围的记录,分区表达式可以是列,也可以是包含列的表达式。MySQL 还支持键值、哈希和列表分区。

还有一些其他的分区技术:

根据键值进行分区,来减少 InnoDB 的互斥量竞争。
使用数学取模函数进行分区,然后将数据放入不同的分区。


系列文章

🔥 高性能 MySQL(一):逻辑架构

🔥 高性能 MySQL(二):并发控制(锁)

🔥 高性能 MySQL(三):事务与锁详解

🔥 高性能 MySQL(四):多版本并发控制(MVCC)

🔥 高性能 MySQL(五):设计表结构时,如何选择数据类型会更高效?

🔥 高性能 MySQL(六):索引类型

🔥 高性能 MySQL(七):11个高性能的索引策略

🔥 高性能 MySQL(八):通过优化数据访问,来解决慢查询

🔥 高性能 MySQL(九):通过重构查询语句,来解决慢查询

🔥 高性能 MySQL(十):执行一个查询的过程

🔥 高性能 MySQL(十一):优化特定类型的查询

热门专栏

👍 《IDEA 教程:从入门到精通

👍 《Java 教程:从入门到精通

👍 《MySQL 教程:从入门到精通

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
19天前
|
分布式计算 DataWorks 关系型数据库
实时数仓 Hologres产品使用合集之如何将MySQL数据初始化到分区表中
实时数仓Hologres的基本概念和特点:1.一站式实时数仓引擎:Hologres集成了数据仓库、在线分析处理(OLAP)和在线服务(Serving)能力于一体,适合实时数据分析和决策支持场景。2.兼容PostgreSQL协议:Hologres支持标准SQL(兼容PostgreSQL协议和语法),使得迁移和集成变得简单。3.海量数据处理能力:能够处理PB级数据的多维分析和即席查询,支持高并发低延迟查询。4.实时性:支持数据的实时写入、实时更新和实时分析,满足对数据新鲜度要求高的业务场景。5.与大数据生态集成:与MaxCompute、Flink、DataWorks等阿里云产品深度融合,提供离在线
|
9天前
|
存储 关系型数据库 MySQL
MySQL 分区表
MySQL 分区表
25 4
|
19天前
|
分布式计算 DataWorks 关系型数据库
DataWorks产品使用合集之当需要将数据从ODPS同步到RDS,且ODPS表是二级分区表时,如何同步所有二级分区的数据
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
24 7
|
23小时前
|
存储 关系型数据库 MySQL
MySQL分区表:万字详解与实践指南
MySQL分区表:万字详解与实践指南
|
15天前
|
存储 关系型数据库 MySQL
【MySQL技术内幕】4.8-分区表
【MySQL技术内幕】4.8-分区表
23 0
|
1月前
|
Kubernetes 关系型数据库 MySQL
高性能 MySQL 第四版(GPT 重译)(四)(4)
高性能 MySQL 第四版(GPT 重译)(四)
46 6
|
1月前
|
存储 算法 关系型数据库
高性能 MySQL 第四版(GPT 重译)(四)(1)
高性能 MySQL 第四版(GPT 重译)(四)
60 6
|
1月前
|
存储 运维 关系型数据库
高性能 MySQL 第四版(GPT 重译)(四)(2)
高性能 MySQL 第四版(GPT 重译)(四)
78 4
|
1月前
|
SQL 监控 关系型数据库
高性能 MySQL 第四版(GPT 重译)(三)(3)
高性能 MySQL 第四版(GPT 重译)(三)
70 4
|
1月前
|
存储 缓存 关系型数据库
高性能 MySQL 第四版(GPT 重译)(三)(1)
高性能 MySQL 第四版(GPT 重译)(三)
101 4

热门文章

最新文章