MySQL 8.0 参考手册  / 第24章分区  /  19.2 分区类型

19.2 分区类型

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

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

KEY按或 分区时LINEAR 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 5.6 中,还可以使用 DATEor DATETIME列作为使用RANGE COLUMNSLIST COLUMNS分区的分区列。

然而,MySQL 的其他分区类型需要一个分区表达式,该表达式产生一个整数值或 NULL. 如果您希望按RANGELISTHASH或来使用基于日期的分区LINEAR HASH,您可以简单地使用对 、 或 列进行操作 DATETIME返回 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.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+01or之类的表达式6-2,即使它的计算结果为整数值也是如此。不允许使用小数。

在接下来的部分中,我们不必提供可用于创建每种分区类型的语法的所有可能形式;此信息可在 第 13.1.17 节,“CREATE TABLE 语句”中找到。