本文地址:https://www.askmac.cn/archives/mysql-partition-type.html
9.2 分区类型
- RANGE分区:基于列值所处在的给定范围来对行进行分区。
- LIST分区:和RANGE分区类似,不过区别是基于一组离散值集合中的值匹配来进行分区。
- HASH分区:分区的选择基于要插入行的列值进行用户定义功能函数计算后的返回值。其功能函数可以包括任意MySQL有效表达式并返回一个非负的整数值。
- KEY分区:和Hash分区类似,不过区别是使用MySQL自有的哈希功能来对一列或多列进行哈希计算,其中的列值也可以包含除整数值之外的值,而MySQL并不关心列值的具体数据类型,在哈希计算后,都会返回一个整数值。
通常使用数据库分区时会按日期时间来都对数据进行分割。一些数据库系统支持显式时间日期分区语法,不过MySQL不支持。不过在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的其它分区类型都要求有一个分区表达式并生成一个整型值或空值。如果你希望通过使用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 );
注: 从MySQL5.5开始,可以使用RANGE COLUMNS和LIST COLUMNS语法对DATE或DATETIME列进行直接分区操作了。
MySQL分区在建立时使用TO_DAYS()和YEAR()功能函数来进行处理。不过,你也可以使用其它时间日期功能来返回整型或NULL值,如WEEKDAY(),DAYOFYEAR(),或MONTH()等等。
需要注意的是 — 不管你是用的是何种分区类型 — 分区总是会在被建立时按顺序被自动编号,起始编号为0。当有新行被插入一张分区表,这些分区号被用于确认分配到正确的分区。例如,如果你的某张表有4个分区,这些分区被以0,1,2和3进行了编号。对于RANGE和LIST分区类型,你需要保证每个分区都被定义有一个分区号。对于HASH分区,使用用户功能函数必须返回为一个大于0的整数值。对KEY分区,这种计算会被MySQL内部的哈希功能自动处理。
对分区的命名通常需要遵循MySQL标识符命名规范,如表名,数据库名定义规范等。不过,应该了解的是,这些分区名都是大小写不敏感的。例如,以下create table语句就会执行失败:
报错发生的原因是因为MySQL会将分区名PartName1和partname1作同名处理。
如果你需要为一张表指定分区数量,这个数量值需要是一个打头不带0的非0正值,不能为如0.8E+01或6-2之类的表达式(即便它们和整数值相等)。
注意:MySQL 5.1.12开始,指定分区的值带有小数将不再被截断处理,而是报语句失败,拒绝执行。
Comment