03-分区类型
本节主要讨论在MySQL 5.1中可用的分区类型,主要有以下 4种。
RANGE分区:基于一个给定连续区间范围,把数据分配到不同的分区。
LIST分区:类似RANGE分区,区别在LIST分区是基于枚举出的值列表分区,RANGE是基于给定的连续区间范围分区。
HASH分区:基于给定的分区个数,把数据分配到不同的分区。
KEY分区:类似于HASH分区。
在MySQL 5.1版本中,RANGE分区、LIST分区、HASH分区都要求分区键必须是 INT类型,或者通过表达式返回 INT类型,也就说MySQL 5.1仅仅支持整数分区,唯一的例外就是分区类型为KEY分区时,可以使用其他类型的列(BLOB或TEXT列类型除外)作为分区键。
注意:在MySQL 5.5或以上版本中,已经支持非整数的RANGE和LIST分区了,具体示例可以参见“17.2.3 Columns分区”小节。
无论是哪种 MySQL 分区类型,要么分区表上没有主键/唯一键,要么分区表的主键/唯一键都必须包含分区键,也就是说不能使用主键/唯一键字段之外的其他字段分区,例如 emp 表的主键为id字段,在尝试通过store_id字段分区的时候,MySQL会提示返回失败:
mysql> CREATE TABLE emp (
-> id INT NOT NULL,
-> ename VARCHAR(30),
-> hired DATE NOT NULL DEFAULT '1970-01-01',
-> separated DATE NOT NULL DEFAULT '9999-12-31',
-> job VARCHAR(30) NOT NULL,
-> store_id INT NOT NULL,
-> PRIMARY KEY (id)
-> )
-> PARTITION BY RANGE (store_id) (
-> PARTITION p0 VALUES LESS THAN (10),
-> PARTITION p1 VALUES LESS THAN (20),
-> PARTITION p2 VALUES LESS THAN (30)
-> );
ERROR 1503 (HY000): A PRIMARY KEY must include all columns in the table's partitioning function
去掉主键约束后,创建表就会成功:
mysql> CREATE TABLE emp (
-> id INT NOT NULL,
-> ename VARCHAR(30),
-> hired DATE NOT NULL DEFAULT '1970-01-01',
-> separated DATE NOT NULL DEFAULT '9999-12-31',
-> job VARCHAR(30) NOT NULL,
-> store_id INT NOT NULL
-> )
-> PARTITION BY RANGE (store_id) (
-> PARTITION p0 VALUES LESS THAN (10),
-> PARTITION p1 VALUES LESS THAN (20),
-> PARTITION p2 VALUES LESS THAN (30)
-> );
Query OK, 0 rows affected (0.05 sec)
分区的名字基本上遵循MySQL标识符的原则。说到命名,顺便介绍一下MySQL命名中的大小写敏感:在MySQL中,数据库和表对应于数据目录中的目录和文件。所以,操作系统的大小写敏感性决定数据库和表命名的大小写敏感性。这就意味着数据库和表名在 Windows中是大小写不敏感的,而在大多数的UNIX或Linux系统中是大小写敏感的。但是需要注意的是,分区的名字是不区分大小写的。例如,下面的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 1517 (HY000): Duplicate partition name mypart
这是因为MySQL认为分区名字mypart和MyPart没有区别。