mysql分区/分区类型

第三章分区类型

本节讨论MySQL 8.0中可用的分区类型。这些包括这里列出的类型:

  • 范围分区。这种类型的分区根据给定范围内的列值将行分配给分区。看到3.1节,“范围划分”。有关此类型的扩展的信息,范围列,请参阅Section 3.3.1,“RANGE列分区”

  • 分区列表。类似于分区范围,除了基于匹配一组离散值之一的列选择分区之外。看到第3.2节,“LIST分区”。有关此类型的扩展的信息,列表列,请参阅Section 3.3.2, " LIST COLUMNS partitioning "

  • 散列分区。对于这种类型的分区,将根据用户定义表达式返回的值选择分区,该表达式对要插入到表中的行中的列值进行操作。这个函数可以包含MySQL中任何有效的表达式,可以产生一个非负整数值。对这种类型的扩展,线性散列,也可用。看到第3.4节,“HASH分区”

  • 关键的分区。这种类型的分区类似于分区哈希MySQL服务器提供了自己的哈希函数。这些列可以包含整数以外的值,因为MySQL提供的哈希函数保证了一个整数结果,而不管列数据类型如何。对这种类型的扩展,线键,也可用。看到第3.5节,“KEY Partitioning”

数据库分区的非常常见的使用是按日期分离数据。某些数据库系统支持显式日期分区,MySQL不在8.0中实现。但是,MySQL在基于的分区方案中并不困难日期时间,或DATETIME列或基于使用此类列的表达式。

当分区关键或者线键,你可以用a日期时间,或DATETIME列作为分区列而不执行列值的任何修改。例如,此表创建语句在MySQL中完全有效:

CREATE TABLE members (firstname VARCHAR(25) NOT NULL, lastname VARCHAR(25) NOT NULL, username VARCHAR(16) NOT NULL, email VARCHAR(35), joined DATE NOT NULL) PARTITION BY KEY PARTITIONS 6;

在MySQL 8.0中,也可以使用日期或者DATETIME作为分区列使用范围列列表列分区。

其他分区类型需要生成整数值或空值。如果您希望使用基于日期的分区范围列表哈希,或线性散列,你可以简单地使用一个函数对日期时间,或DATETIME列并返回这样一个值,如下所示:

创建表成员(FirstName varchar(25)not null,lastName varchar(25)not null,Username varchar(16)not null,电子邮件varchar(35),加入日期不是null)按范围分区(年(加入))(分区P0值小于(1960),分区P1值小于(1970),分区P2值小于(1980),分区P3值小于(1990),分隔P4值小于maxvalue);

使用日期进行分区的其他例子可以在本章的下面几节中找到:

有关更复杂的基于日期的分区示例,请参见以下部分:

MySQL分区是为使用to_days()年(), 和to_seconds()功能。但是,您可以使用其他返回整数或空值,如工作日()DAYOFYEAR (),或月()。看到日期和时间函数,有关此类功能的更多信息。

重要的是要记住 - 无论您使用的分区类型如何 - 在创建时始终会自动编号,从而开始0。当将新行插入分区表时,这些分区号用于标识正确的分区。例如,如果您的表使用4个分区,那么这些分区是编号的012, 和3.。为了范围列表分区类型时,有必要确保为每个分区号定义一个分区。为哈希分区,用户提供的表达式必须评估为大于的整数值0。为关键分区,MySQL Server在内部采用的散列函数会自动处理此问题。

分区的名称通常遵循其他MySQL标识符的规则,比如表和数据库标识符。但是,您应该注意分区名称不区分大小写。例如,如下创建表语句失败如下所示:

mysql> CREATE TABLE t2 (val INT) -> PARTITION BY LIST(val)(-> PARTITION mypart VALUES IN (1,3,5), -> PARTITION mypart VALUES IN (2,4,6) ->);错误1488 (HY000):重复分区名称mypart

失败发生,因为MySQL看不到分区名称之间的区别mypart我这边

当您为表指定分区数时,这必须表示为一个正的、非零整数,前导零为零,并且不能是这样的表达式0.8 e + 01或者6 - 2,即使它评估到整数值。不允许小数分数。

在遵循的部分中,我们不一定为可用于创建每个分区类型的语法提供所有可能的表单;为此信息,请参阅CREATE TABLE语句