22.2 分区类型
本节讨论 MySQL 5.7 中可用的分区类型。这些包括此处列出的类型:
-
RANGE 分区. 这种类型的分区根据给定范围内的列值将行分配给分区。参见第 22.2.1 节“ RANGE 分区”。有关此类型的 extensions
RANGE COLUMNS
的信息,请参见第 22.2.3.1 节“ RANGE COLUMNS 分区”。 -
LIST 分区. 与
RANGE
分区类似,区别在于分区是根据与一组离散值之一匹配的列选择的。参见第 22.2.2 节“列 table 分区”。有关此类型的 extensionsLIST COLUMNS
的信息,请参见第 22.2.3.2 节“列 table 列分区”。 -
HASH 分区. 使用这种类型的分区时,将根据用户定义的 table 达式返回的值来选择一个分区,该 table 达式对要插入 table 中的行中的列值进行运算。该函数可以包含在 MySQL 中有效的任何产生非负整数值的 table 达式。此类型的 extensions
LINEAR HASH
也是可用的。参见第 22.2.4 节“ HASH 分区”。 -
键分区. 这种分区类型类似于
HASH
进行分区,不同之处在于仅提供了一个或多个要评估的列,并且 MySQL 服务器提供了自己的哈希函数。这些列可以包含非整数值,因为 MySQL 提供的哈希函数可以保证整数结果,而与列数据类型无关。也可以使用此类型的 extensionsLINEAR KEY
。参见第 22.2.5 节“密钥分区”。
数据库分区的一种非常普遍的用法是按日期隔离数据。一些数据库系统支持显式日期分区,而 MySQL 在 5.7 中未实现。但是,在 MySQL 中创建基于DATE,TIME或DATETIME列或基于使用此类列的 table 达式的分区方案并不困难。
通过KEY
或LINEAR KEY
进行分区时,可以将DATE,TIME或DATETIME列用作分区列,而无需对列值进行任何修改。例如,此 table 创建语句在 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(joined)
PARTITIONS 6;
在 MySQL 5.7 中,也可以使用RANGE COLUMNS
和LIST COLUMNS
分区将DATE或DATETIME列用作分区列。
但是,MySQL 的其他分区类型需要一个分区 table 达式,该 table 达式产生一个整数值或NULL
。如果您希望按RANGE
,LIST
,HASH
或LINEAR HASH
使用基于日期的分区,则可以简单地使用对DATE,TIME或DATETIME列进行操作并返回该值的函数,如下所示:
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 RANGE( YEAR(joined) ) (
PARTITION p0 VALUES LESS THAN (1960),
PARTITION p1 VALUES LESS THAN (1970),
PARTITION p2 VALUES LESS THAN (1980),
PARTITION p3 VALUES LESS THAN (1990),
PARTITION p4 VALUES LESS THAN MAXVALUE
);
在本章的以下各节中,可以找到使用日期进行分区的其他示例:
有关基于日期的分区的更复杂的示例,请参见以下部分:
MySQL 分区已针对TO_DAYS(),YEAR()和TO_SECONDS()函数进行了优化。但是,您可以使用其他返回整数或NULL
的日期和时间函数,例如WEEKDAY(),DAYOFYEAR()或MONTH()。有关此类功能的更多信息,请参见第 12.6 节“日期和时间函数”。
重要的是要记住,无论您使用哪种分区类型,分区始终会自动创建并在创建时按 Sequences 编号(从0
开始)。当在分区 table 中插入新行时,正是这些分区号用于标识正确的分区。例如,如果您的 table 使用 4 个分区,则这些分区的编号分别为0
,1
,2
和3
。对于RANGE
和LIST
分区类型,有必要确保为每个分区号定义一个分区。对于HASH
分区,用户提供的 table 达式必须计算为大于0
的整数值。对于KEY
分区,此问题由 MySQL 服务器内部使用的哈希函数自动解决。
分区名称通常遵循 Management 其他 MySQL 标识符的规则,例如 table 和数据库的标识符。但是,您应该注意分区名称不区分大小写。例如,以下CREATE TABLE语句失败,如下所示:
mysql> CREATE TABLE t2 (val INT)
-> PARTITION BY LIST(val)(
-> PARTITION mypart VALUES IN (1,3,5),
-> PARTITION MyPart VALUES IN (2,4,6)
-> );
ERROR 1488 (HY000): Duplicate partition name mypart
发生故障是因为 MySQL 认为分区名称mypart
和MyPart
没有区别。
当指定 table 的分区数时,该值必须 table 示为无前导零的正非零整数 Literals,并且即使是计算结果为整数值,也可能不是诸如0.8E+01
或6-2
之类的 table 达式。不允许小数部分。
在以下各节中,我们不一定提供可用于创建每种分区类型的语法的所有可能形式;此信息可以在第 13.1.18 节“ CREATE TABLE 语句”中找到。