https://dev.mysql.com/doc/refman/5.7/en/partitioning.html
分区(Partitioning)使这个概念更进一步,它使您能够根据您可以根据需要大量设置的规则在文件系统中分发单个表的各个部分。实际上,表的不同部分作为单独的表存储在不同的位置。用户选择的数据划分规则称为分区函数,在 MySQL 中可以是模数,对一组范围或值列表的简单匹配,内部哈希函数,或线性哈希函数。该函数根据用户指定的分区类型选择,并将用户提供的表达式的值作为其参数。这个表达式可以是列值、对一个或多个列值执行操作的函数,或者是一组一个或多个列值,具体取决于所使用的分区类型。
分区类型:
- RANGE:根据给定范围内的列值将行分配给分区。
- LIST:与 RANGE 分区类似,只是分区是根据与一组离散值中的一个匹配的列选择的。
- HASH:使用这种类型的分区,可以根据用户定义的表达式返回的值选择分区,该表达式对要插入到表中的行中的列值进行操作。该函数可以由 MySQL 中任何有效的表达式组成,这些表达式可以产生非负整数值。对这种类型的扩展 LINEAR HASH 也是可用的。
- KEY:这种类型的分区类似于通过 HASH 进行分区,只是只提供了一个或多个需要计算的列,并且 MySQL 服务器提供了自己的哈希函数。这些列可以包含整数以外的值,因为 MySQL 提供的散列函数保证了一个整数结果,而与列数据类型无关。此类型的一个扩展,LINEAR KEY 也是可用的。
数据库分区的一个非常常见的用途是按日期隔离数据。一些数据库系统支持显式的数据分区,MySQL 在5.7中没有实现这一功能。然而,在 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 5.7中,还可以使用 DATE 或 DATETIME 列作为使用 RANGE COLUMNS 和 LIST COLUMNS 分区的分区列。
然而,MySQL 的其他分区类型需要一个分区表达式,该表达式生成一个整数值或 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
);
