MySQL中的LIST分区在很多方面类似于RANGE分区。和按照RANGE分区一样,每个分区必须明确定义。它们的主要区别在于,LIST分区中每个分区的定义和选择是基于某列的值从属于一个值列表集中的一个值,而RANGE分区是从属于一个连续区间值的集合。LIST分区通过使用“PARTITION BY LIST(expr)”来实现,其中“expr” 是某列值或一个基于某个列值、并返回一个整数值的表达式,然后通过“VALUES IN (value_list)”的方式来定义每个分区,其中“value_list”是一个通过逗号分隔的整数列表。
注释:在MySQL 5.1中,当使用LIST分区时,有可能只能匹配整数列表。
不像按照RANGE定义分区的情形,LIST分区不必声明任何特定的顺序。 如:红旗超市在全国的连锁店数据表。我们按东部(1,2,3,4)、西部(5,6,7,8)、中部(10,11,12,13)进行分区。
create table supermarket ( id int not null, xzqhId int not null, -- 行政区划ID sort int -- 序号 ) partition by list (xzqhId)( partition pEast values in (1,2,3,4), partition pWest values in (5,6,8,7), partition pCenter values in (11,13,12,10) );
要点:
如果试图插入列值(或分区表达式的返回值)不在分区值列表中的一行时,那么“INSERT”查询将失败并报错。例如,假定LIST分区的采用上面的方案,下面的查询将失败:
INSERT INTO values(id, xzqhId, sort)supermarket(20, 14, 20);
这是因为“xzqhId”列值14不能在用于定义分区pEast, pWest,或pCenter的值列表中找到。要重点注意的是,LIST分区没有类似如“VALUES LESS THAN MAXVALUE”这样的包含其他值在内的定义。将要匹配的任何值都必须在值列表中找到。