Mysql --分区表(7)Key分区

来源:互联网 发布:gamecenter数据不同步 编辑:程序博客网 时间:2024/05/29 14:31

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都用不上。这种分区方法也不能很好地利用分区裁剪特性
0 0