Key分区
按照Key进行分区非常类似于按照Hash进行分区,只不过Hash分区允许使用用户自定义的表达式,而Key分区不允许使用用户自定义的表达式,需要使用MySQL服务器提供的HASH函数;同时Hash分区只支持整数分区,而Key分区支持使用BLOB或Text类型外其他类型的列作为分区键
我们同样可以使用Partition by key(expr)子句来创建一个key分区表,expr是零个或者多个字段名的列表。下面语句创建了一个机遇job字段进行分区的表,表被分成了4个分区
CREATE TABLE employees (
id INT NOT NULL,
fname VARCHAR(30),
lname 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
)
PARTITION BY KEY(job)
PARTITIONS 4;
与HASH分区不同,创建Key分区表的时候,可以不指定分区键,默认会首先选择使用主键作为分区键
CREATE TABLE k1 (
id INT NOT NULL PRIMARY KEY,
name VARCHAR(20)
)
PARTITION BY KEY()
PARTITIONS 2;
在没有主键的情况,会使用非空唯一键作为分区键
CREATE TABLE k1 (
id INT NOT NULL,
name VARCHAR(20),
UNIQUE KEY (id)
)
PARTITION BY KEY()
PARTITIONS 2;
如果作为分区键的唯一键不是非空的(没有指定NOT NULL子句),依然会报错
CREATE TABLE k1 (
id INT ,
name VARCHAR(20),
UNIQUE KEY (id)
)
PARTITION BY KEY()
PARTITIONS 2;
ERROR 1488 (HY000): Field in list of fields for partition function not found in table
如果即没哟主键,也没有唯一键,就必须要指定分区键了
例子
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;
delimiter $$
drop procedure if exists pr_insertdate$$
create procedure pr_insertdate(in begindate date,in enddate date)
begin
while begindate<enddate
do
insert into members values('fan','boshi','duyalan',null,begindate);
set begindate = date_add(begindate,interval 1 day);
end while;
end$$
delimiter ;
mysql> call pr_insertdate('2015-01-01','2016-08-08');
Query OK, 1 row affected (0.06 sec)
mysql> select count(*) from members;
+----------+
| count(*) |
+----------+
| 585 |
+----------+
1 row in set (0.00 sec)
select
partition_name part,
partition_expression expr,
partition_description descr,
table_rows
from information_schema.partitions where
table_schema = schema()
and table_name='members';
+------+----------+-------+------------+
| part | expr | descr | table_rows |
+------+----------+-------+------------+
| p0 | `joined` | NULL | 177 |
| p1 | `joined` | NULL | 0 |
| p2 | `joined` | NULL | 208 |
| p3 | `joined` | NULL | 0 |
| p4 | `joined` | NULL | 200 |
| p5 | `joined` | NULL | 0 |
+------+----------+-------+------------+
6 rows in set (0.00 sec)
然而根据我的实验这种分区貌似没什么卵子用,p1 p3 p5都用不上。这种分区方法也不能很好地利用分区裁剪特性