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