12.LIST分区

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分区。

猜你喜欢

转载自blog.csdn.net/c1776167012/article/details/121020373