MySQL 9.0 参考手册  /  分区  /  分区类型

26.2 分区类型

本节讨论 MySQL 9.0 中可用的分区类型。 这些类型包括此处列出的类型

数据库分区的一个非常常见的用途是按日期隔离数据。 一些数据库系统支持显明的日期分区,而 MySQL 在 9.0 中没有实现。 但是,在 MySQL 中,基于 DATETIMEDATETIME 列,或基于使用此类列的表达式创建分区方案并不困难。

KEYLINEAR KEY 分区时,您可以使用 DATETIMEDATETIME 列作为分区列,而无需对列值进行任何修改。 例如,此表创建语句在 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 9.0 中,还可以使用 DATEDATETIME 列作为分区列,使用 RANGE COLUMNSLIST COLUMNS 分区。

其他分区类型需要一个产生整数值或 NULL 的分区表达式。 如果您希望按 RANGELISTHASHLINEAR HASH 使用基于日期的分区,您可以简单地使用一个对 DATETIMEDATETIME 列进行操作并返回此类值的函数,如下所示

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 个分区,则这些分区编号为 0123。 对于 RANGELIST 分区类型,必须确保为每个分区号定义了一个分区。 对于 HASH 分区,用户提供的表达式必须计算为整数值。 对于 KEY 分区,此问题由 MySQL 服务器在内部使用的哈希函数自动处理。

分区名称通常遵循管理其他 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 认为分区名称 mypartMyPart 之间没有区别。

当您指定表的**分区数**时,必须将其表示为一个正的非零整数文字,没有前导零,并且不能是 0.8E+016-2 之类的表达式,即使它计算结果为整数值。 不允许使用小数。

在接下来的部分中,我们不一定为每种分区类型提供所有可能的语法形式; 有关此信息,请参阅 第 15.1.20 节,“CREATE TABLE 语句”