本节讨论 MySQL 9.0 中可用的分区类型。 这些类型包括此处列出的类型
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 在 9.0 中没有实现。 但是,在 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 9.0 中,还可以使用 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 语句”。