Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  Partitioning  /  Partitioning Types

26.2 分区类型

本节讨论了 MySQL 8.3 中可用的分区类型。这些类型包括以下几种:

数据库分区的一种非常常见的用途是根据日期来分隔数据。一些数据库系统支持明确的日期分区,MySQL 8.3 不实现这种分区。但是,在 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 8.3 中,也可以使用 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 语句”