本节讨论 MySQL 8.4 中可用的分区类型。这些类型包括这里列出的类型
RANGE 分区。 此类分区根据落在给定范围内的列值将行分配给分区。请参阅第 26.2.1 节“RANGE 分区”。有关此类型的扩展(
RANGE COLUMNS)的信息,请参阅第 26.2.3.1 节“RANGE COLUMNS 分区”。LIST 分区。 与按
RANGE分区类似,不同之处在于分区是根据与一组离散值之一匹配的列来选择的。请参阅第 26.2.2 节“LIST 分区”。有关此类型的扩展(LIST COLUMNS)的信息,请参阅第 26.2.3.2 节“LIST COLUMNS 分区”。HASH 分区。 使用此类分区时,将根据用户定义的表达式的返回值选择分区,该表达式对要插入到表中的行中的列值进行操作。该函数可以包含 MySQL 中有效的任何表达式,该表达式产生一个整数值。请参阅第 26.2.4 节“HASH 分区”。
此类型还有一个扩展,
LINEAR HASH,请参阅第 26.2.4.1 节“LINEAR HASH 分区”。KEY 分区。 此类分区类似于按
HASH分区,不同之处在于只提供一个或多个要评估的列,并且 MySQL 服务器提供其自己的哈希函数。这些列可以包含除整数值以外的值,因为 MySQL 提供的哈希函数保证无论列数据类型如何都能产生一个整数结果。此类型还有一个扩展,LINEAR KEY。请参阅第 26.2.5 节“KEY 分区”。
数据库分区的一个非常常见的用途是按日期隔离数据。某些数据库系统支持显式日期分区,而 MySQL 在 8.4 中没有实现。但是,在 MySQL 中,根据 DATE、TIME 或 DATETIME 列,或者根据使用此类列的表达式来创建分区方案并不困难。
当按 KEY 或 LINEAR KEY 分区时,可以使用 DATE、TIME 或 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(joined)
PARTITIONS 6;在 MySQL 8.4 中,还可以使用 DATE 或 DATETIME 列作为使用 RANGE COLUMNS 和 LIST COLUMNS 分区的 partitioining 列。
其他分区类型需要一个产生整数值或 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()。有关此类函数的更多信息,请参阅第 14.7 节“日期和时间函数”。
重要的是要记住,无论使用哪种类型的分区,分区在创建时始终会自动按顺序编号,从 0 开始。将新行插入到分区表中时,将使用这些分区号来标识正确的分区。例如,如果您的表使用 4 个分区,则这些分区的编号为 0、1、2 和 3。对于 RANGE 和 LIST 分区类型,必须确保为每个分区号定义了一个分区。对于 HASH 分区,用户提供的表达式必须计算为整数值。对于 KEY 分区,此问题由 MySQL 服务器在内部使用的哈希函数自动处理。
分区名称通常遵循 governing other MySQL 标识符的规则,例如表和数据库的标识符。但是,您应该注意,分区名称不区分大小写。例如,以下 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 之间的区别。
当您指定表的 partitioin 数量时,必须将其表示为一个正的、非零的整数字面量,且前面没有零,并且不能是表达式(例如 0.8E+01 或 6-2),即使它计算结果为整数值也是如此。不允许使用小数。
在以下部分中,我们不一定会提供可用于创建每种分区类型的所有可能的语法形式;有关此信息,请参阅第 15.1.20 节“CREATE TABLE 语句”。