MySQL分区类型二--list分区

2015-04-18 22:34:00
hainuo
来源:
CSDN
转贴 1743

  • LIST分区

      类似于按RANGE分区,区别在于LIST分区是 基于列值匹配一个 离散值集合中的某个值来进行选择。

      LIST分区通过使用“PARTITION BY LIST(expr)”来实现,其中“expr” 是某列值或一个基于某个列值、并返回一个整数值的表达式,然后通过“VALUES IN (value_list)”的方式来定义每个分区, 其中“value_list”是一个通过逗号分隔的整数列表
注释:在MySQL 5.1中,当使用LIST分区时,有可能只能匹配整数列表。

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_code INT,   
    store_id INT  
);  

假定有20个音像店,分布在4个有经销权的地区,如下表所示:

====================
地区      商店ID 号

------------------------------------

北区      3, 5, 6, 9, 17
东区      1, 2, 10, 11, 19, 20
西区      4, 12, 13, 14, 18
中心区   7, 8, 15, 16

====================
要按照属于同一个地区商店的行保存在同一个分区中的方式来分割表,可以使用下面的“CREATE TABLE”语句:

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_code INT,   
    store_id INT  
)   
  
PARTITION BY LIST(store_id)   
    PARTITION pNorth VALUES IN (3,5,6,9,17),   
    PARTITION pEast VALUES IN (1,2,10,11,19,20),   
    PARTITION pWest VALUES IN (4,12,13,14,18),   
    PARTITION pCentral VALUES IN (7,8,15,16)   
);  
这使得在表中增加或删除指定地区的雇员记录变得容易起来。例如,假定西区的所有音像店都卖给了其他公司。那么与在西区音像店工作雇员相关的所有记录(行)可以使用查询“ALTER TABLE employees DROP PARTITION pWest;”来进行删除,它与具有同样作用的DELETE (删除)查询“DELETE query DELETE FROM employees WHERE store_id IN (4,12,13,14,18);”比起来,要有效得多。
【要点】:如果试图插入列值(或分区表达式的返回值)不在分区值列表中的一行时,那么“INSERT”查询将失败并报错。例如,假定LIST分区的采用上面的方案,下面的查询将失败:


INSERT INTO employees VALUES(224, 'Linus', 'Torvalds', '2002-05-01', '2004-10-12', 42, 21);  

这是因为“store_id”列值21不能在用于定义分区pNorth, pEast, pWest,或pCentral的值列表中找到。要重点注意的是, LIST分区没有类似如“ VALUES LESS THAN MAXVALUE”这样的包含其他值在内的定义。将要匹配的任何值都必须在值列表中找到。


LIST分区除了能和RANGE分区 结合起来生成一个复合的子分区,与HASH和KEY分区结合起来生成复合的子分区也是可能的。




发表评论
玖 减 玖 =
评论通过审核后显示。