1.何为LIST分区?
LIST和RANGE分区唯一的区别就是,RANGE分区存储的值是连续的区间,而LIST分区存储的值是离散的。
2.例子学习
CREATE TABLE t(
a int,
b int
)
partition by list(b)(
partition p0 values in(1,3,5,7,9),
partition p1 values in(0,2,4,6,8)
);
这表示p0分区只能存储b列为1,3,5,7,9的行数据。
注意,它的用法和range分区有所不同:
partition by list(b)(
partition p0 values in(1,3,5,7,9),
partition p1 values in(0,2,4,6,8)
)
现在,我们向这个分区表中插入数据:
INSERT INTO t(a,b)values(2,1);
INSERT INTO t(a,b)values(2,2);
INSERT INTO t(a,b)values(2,3);
INSERT INTO t(a,b)values(2,4);
下面插入一条不符合分区的数据:
INSERT INTO t(a,b)values(2,10);
很明显,插入失败。
这里我们要注意:在INNODB中,在执行多个insert的过程中,如果有一条失败,那么整个插入过程会回滚!!
3.LIST分区的应用场景
LIST分区特别适合枚举值列的分区,例如,将根据性别分区。
下面创建一张表:
CREATE TABLE class_people(
id int auto_increment,
name varchar(20),
sex int ,
primary key(id,sex)
)
partition by list(sex)(
partition p0 values in(1),
partition p1 values in(0)
);
其中1代表男生,0代表女生。
然后向表中插入数据:
INSERT INTO class_people(name,sex)values('tom',1);
INSERT INTO class_people(name,sex)values('tony',0);
INSERT INTO class_people(name,sex)values('baby',1);
INSERT INTO class_people(name,sex)values('jayme',0);
下面看下下面语句的执行计划:
SELECT * FROM class_people where sex=1;
查找性别为男的数据:
可以明显的看到只查询了p0分区。