分区就是把一个数据表的文件和索引分散存储在不同的物理文件中。

对于分区表来说,同一个分区表的所有分区必须使用同一个存储引擎,即同一个表上,不能对不同的分区用不同的存储引擎;但是,可以在同一个MySQL服务器中,甚至同一个数据库中,对不同的分区表使用不同的存储引擎。

MySQL支持的分区类型包括Range、List、Hash、Key,其中Range比较常用:

RANGE分区:基于属于一个给定连续区间的列值,把多行分配给分区。

LIST分区:类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择。

HASH分区:基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL 中有效的、产生非负整数值的任何表达式。

KEY分区:类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL服务器提供其自身的哈希函数。必须有一列或多列包含整数值。

在MySQL中,数据库和表对应与数据目录中的目录和文件。所以,操作系统的大小写敏感性决定数据库和表命名的大小写敏感性。这就意味着数据库和表名在Windows中是大小写不敏感的,而在Unix和Linux中大小写敏感。但是需要注意的是,分区的名字是不区分大小写的。

Range分区

按照RANGE分区的表是利用取值范围将数据分成分区,区间要连续并且不能重叠,使用value less than操作符进行分区定义。

读书笔记之MySQL分区机制

如上图所示,当插入的storeid大于等于设置的最大ID时,就会报错,我们可以通过add语句来添加分区。

List分区

List分区是建立离散的值列表告诉数据库特定的值属于哪个分区,list分区在很多时候类似与Range分区,区别在List分区是从属于枚举列表的值的集合,Range分区是从属于一个连续区间的集合。对于List分区来说,将要匹配的任何值都必须在值列表中找得到。

读书笔记之MySQL分区机制

Hash分区

Hash分区主要用来分散热点读,确保数据在预先确定个数的分区中尽可能平均分布。对于一个表执行Hash分区时,MySQL会对分区键应用一个散列函数,以此确定数据应当放在N个分区中的哪个分区。

MySQL支持两种Hash分区,常规Hash分区和线性Hash分区,常规Hash分区使用的是取模算法,线性Hash分区使用的是一个线性的2的幂的运算法则。

读书笔记之MySQL分区机制

线性与常规就是看是否添加红色框中的linear。线性分区的优点是在分区维护时,MySQL能够处理得更加迅速;缺点是对比于常规取模时,线性Hash各个分区之间数据的分布不均衡。

Key分区

按照Key进行分区非常类似Hash分区,只不过Hash分区允许使用用户自定义的表达式,而Key分区不允许使用用户自定义的表达式,需要使用MySQL服务器提供的Hash函数;同时Hash分区只支持整数分区,而Key分区支持除BLOB和TEXT类型外其他类型的列作为分区键。

它的语法就是在Hash分区的基础上,将hash换成key。

分区关于NULL值的处理

MySQL不禁止在分区键值上使用NULL,分区键可能是一个字段或者一个用户定义的表达式。Range分区中,NULL值当作最小值处理;List分区中,NULL值必须出现在枚举的列表中,否则不被接受,Hash/Key分区中,NULL值会被当作零值来处理。

相关文章: