MySQL 8.4 Reference Manual  /  Partitioning  /  Partitioning Types

26.2 分区类型

本节讨论了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中创建基于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.4 中,还可以使用 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 语句”