当前位置:网站首页>高性能 MySQL(十二):分区表
高性能 MySQL(十二):分区表
2022-08-09 02:21:00 【水滴技术】

大家好,我是水滴~~
分区表是一个独立的逻辑表,其底层由多个物理子表组成。对分区表的请求,在 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(五):设计表结构时,如何选择数据类型会更高效?
热门专栏

边栏推荐
- ApiFile配置环境
- 基于JMF视频聊天
- 【HNUMSC】C language second lecture
- MT4 / MQ4L entry to the master of EA tutorial lesson two (2) - - MQL language commonly used function account information commonly used functions
- Appium常用操作及H5页面元素定位
- 力扣刷题记录2.1-----27. 移除元素
- Which is the best increased whole life insurance?Is it really safe?
- JDBC technology (2) - set up common sql and configuration files
- .reduce()的简单例子
- 【HNUMSC】C语言第二讲
猜你喜欢
随机推荐
How to install yii2
力扣刷题记录8.1-----206. 反转链表
Appium常用操作及H5页面元素定位
Duplicate class com.google.common.util.concurrent.ListenableFuture found in modules
2020.10.13 Development log
ApiFile配置环境
Etcd realize large-scale application service management of actual combat
帮助安全红队取得成功的11条建议
2022杭电多校第五场1007(生成函数+启发式合并+ntt)
数据库设计的总结
Go-12-Structure
spdlog日志库的封装使用
连接数据库且在网页运行的RDLC
Simple example of .reduce()
ROS 、SLAM 学习 error整理
Json之JArray的使用方法
etcd实现大规模服务治理应用实战
The 7 taboos of time management summarized by the postgraduate students, how many have you won?
composer的使用记录
显著性检验--学习笔记







![[ANT]apache ant 安装说明](/img/65/9ed0052d0f950b4dad0fc3430b7271.png)

