MySql 表分区
MySQL 表分区和分库分表一样,都是为了提高数据库的吞吐量。分区类似于分表,分表是逻辑上将一个大数据量的表分成多个,可以是水平分也可以是垂直分。而分区是将表的一个数据文件拆分成多个,不同的数据拆分到不同的文件中。这样对于一个数据量非常大的表,有多个数据文件来进行存储,这样就提高了数据库的 io 性能
分区的优点
- 和单个磁盘或文件系统分区相比,可以存储更多的数据。
- 优化查询。
- where 子句中包含分区条件时,可以只扫描必要的分区。
- 涉及聚合函数的查询时,可以容易的在每个分区上并行处理,最终只需汇总得到结果。
- 对于已经过期或者不需要保存的数据,可以通过删除与这些数据有关的分区来快速删除数据。
- 跨多个磁盘来分散数据查询,以获得更大的查询吞吐量。
分区方法
将某张表的数据,分别存储到不同的区域中。每个分区都是独立的表,都要存储该分区数据的数据、索引等信息。
使用mysql的分区功能,可以把一个大的数据表分成多个小份,用户不需要区分不同的表名。
表中有主键的时候,分区只能使用主键
KEY 分区,按照某个字段取余
1 | create table post ( |
HASH 分区,基于给定的分区个数,把数据分配到不同的分区。
1 | create table student_hash( |
key 和 hash 分区方法可以有效的分散热点数据。
RANGE 分区,基于一个给定连续区间范围,把数据分配到不同的分区
1 | create table goods ( |
LIST 分区,类似 RANGE 分区,区别在 LIST 分区是基于枚举出的值列表分区,RANGE 是局域给定的连续区间范围分区。
1 | create table user ( |
Clumns 分区
是在mysql5.5引入的分区类型,解决了之前版本 range 和 list 分区只支持整数分区,从而导致需要额外的函数计算得到整数或通过额外的转换表来转换为整数再分区的问题。
Columns 分区可以细分为 range columns 分区和 list columns 分区,这两种分区都支持整数,日期和字符串三大数据类型。
columns 分区的另一个亮点是支持多列分区:
1 | mysql> create table rc3( |
子分区
子分区(subpartitioning)是分区表中对每个分区的再次分割,又被称为符合分区(composite partitioning)。mysql 从 mysql 5.1 开始支持对已经通过 range 或者 list 分区了的表再进行子分区,子分区既可以使用 hash 分区,也可以使用 key 分区。
1 | mysql> create table ts (id int, purchased date) |
表 ts 有3个 range 分区,这 3 个分区中的每个分区又进一步分成 2 个子分区,实际上,整个表被分成了 3*2=6 个分区,由于 partition by range 子句的作用,第一和第二个分区只保存 purchased 列中值小于 1990 的记录。
复合分区适用于保存非常大量的数据记录。
分区管理
取余算法 key hash
采用取余算法的分区数量的修改,不会导致已有分区数据的丢失,需要重新分配数据到新的分区
增加分区: add partition N;
减少分区:coalesce partition N;
条件算法 list range
添加分区
1 | alert table goods add partition( |
删除分区
1 | alert table goods drop partition p1; |
MySql 分区处理 null 值的方式
mysql 不禁止在分区键值上使用 null , 分区键可能是一个字段或者一个用户定义的额表达式。一般情况下,mysql 的分区把 null 当作零值,或者一个最小值进行处理。
range 分区中,null 值会被当作最小值来处理;
list 分区中,null 值必须出现在枚举列表中,否则不被接受;
hash/key 分区中,null 值会被当作零值来处理。
文章标题:MySql 表分区
文章字数:1.3k
本文作者:Waterandair
发布时间:2017-09-05, 09:24:06
最后更新:2019-12-28, 14:03:59
原始链接:https://waterandair.github.io/2017-09-05-mysql-partition.html版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。