当前位置:嗨网首页>书籍在线阅读

08-Key分区

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

按照Key进行分区非常类似于按照HASH进行分区,只不过HASH分区允许使用用户自定义的表达式,而Key分区不允许使用用户自定义的表达式,需要使用MySQL服务器提供的HASH函数;同时HASH分区只支持整数分区,而Key分区支持使用除BLOB or Text类型外其他类型的列作为分区键。

我们同样可以用PARTITION BY KEY(expr)子句来创建一个Key分区表,expr是零个或者多个字段名名的列表。下面语句创建了一个基于job字段进行Key分区的表,表被分成了4个分区:

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 KEY (job) PARTITIONS 4;

Query OK, 0 rows affected (0.04 sec)

与 HASH 分区不同,创建 Key 分区表的时候,可以不指定分区键,默认会首先选择使用主键作为分区键,例如:

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 KEY ( ) PARTITIONS 4;

Query OK, 0 rows affected (0.02 sec)

在没有主键的情况,会选择非空唯一键作为分区键:

mysql> drop table emp;

Query OK, 0 rows affected (0.02 sec)

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,

->  UNIQUE KEY (id)

-> )

-> PARTITION BY KEY ( ) PARTITIONS 4;

Query OK, 0 rows affected (0.01 sec)

注意:作为分区键的唯一键必须是非空的,如果不是非空的,依然会报错。

mysql> CREATE TABLE emp (

->  id INT,

->  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,

->  UNIQUE KEY (id,ename)

-> )

-> PARTITION BY KEY ( ) PARTITIONS 4;

ERROR 1488 (HY000): Field in list of fields for partition function not found in table

在没有主键、也没有唯一键的情况下,就不能不指定分区键了:

mysql> drop table emp;

Query OK, 0 rows affected (0.01 sec)

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 KEY ( ) PARTITIONS 4;

ERROR 1488 (HY000): Field in list of fields for partition function not found in table

注意:在按照Key分区的分区表上,不能够执行“ALTER TABLE DROP PRIMARY KEY;”语句来删除主键,MySQL会返回错误“Field in list of fields for partition function not found in table”。

和HASH分区类似,在KEY分区中使用关键字LINEAR具有同样的作用,也就是LINEAR KEY分区时,分区的编号是通过2的幂算法得到的,而不是通过取模得到的。

KEY分区和HASH分区类似,在处理大量数据记录时,能够有效地分散热点。