本节讨论了 MySQL 8.3 中可用的分区类型。这些类型包括以下几种:
-
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 中任何有效的表达式,yielding 一个整数值。见 第 26.2.4 节,“HASH 分区”。
该类型的扩展,
LINEAR HASH
,也可用,见 第 26.2.4.1 节,“LINEAR HASH 分区”。 -
KEY 分区。 该类型的分区类似于按
HASH
分区,除了只有一个或多个列被评估,并且 MySQL 服务器提供了自己的哈希函数。这些列可以包含非整数值,因为 MySQL 提供的哈希函数保证了整数结果,无论列数据类型如何。该类型的扩展,LINEAR KEY
,也可用。见 第 26.2.5 节,“KEY 分区”。
数据库分区的一种非常常见的用途是根据日期来分隔数据。一些数据库系统支持明确的日期分区,MySQL 8.3 不实现这种分区。但是,在 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.3 中,也可以使用 DATE
或 DATETIME
列作为分区列,使用 RANGE COLUMNS
和 LIST COLUMNS
分区。
其他分区类型需要一个产生整数值或 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 服务器内部使用的哈希函数自动处理。
分区名称通常遵循 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
之间的区别。
当您指定表的分区数量时,必须将其表达为正整数文字,不能带有前导零,且不能是表达式,如 0.8E+01
或 6-2
,即使它评估为整数值。小数部分不允许。
在以下部分中,我们不一定提供每种分区类型的所有可能语法形式;有关这些信息,请参阅 第 15.1.20 节,“CREATE TABLE 语句”。