OceanBase当前支持的类型包括Range分区、Range COLUMNS分区、List分区、List COLUMNS分区、Hash分区和Key分区等,其中:
- Range分区、Range COLUMNS分区、List分区和List COLUMNS分区可以用于解决业务中大量删除带来的性能问题,支持快速删除分区。
- Hash分区和Key分区可以用于大量写入场景下的数据打散。与Hash分区相比,Key分区支持多列打散和非整数类型字段的打散。
| 视频讲解如下 |
|---|
【赵渝强老师】OceanBase的分区表 |
下面分别介绍这几种分区表。
一、 Range分区
一个表按Range分区是指,对于表的每个分区中包含的所有行,按分区表达式计算的值都落在给定的范围内。Range必须是连续的,并且不能有重叠,通过使用VALUES LESS THAN进行定义。下面通过一个示例来进行演示。
(1)创建一张新的员工表,按照薪水建立Ranger分区。
ob>createtableemp_range(empnoint,enamevarchar(10),jobvarchar(10),mgrint,hiredatevarchar(10),salint,commint,deptnoint)partitionbyrange(sal)(partitionp0valuesless than(1000),partitionp1valuesless than(3000),partitionp2valuesless than maxvalue);(2)往表中插入数据。
ob>insertintoemp_rangeselect*fromemp;(3)查询薪水在2000~2500之间的员工,并查看执行计划。
ob>explainselect*fromemp_rangewheresalbetween2000and2500;# 提示:从执行计划可以看出,本次查询只扫描分区p1。二、 Range COLUMNS分区
Range COLUMNS分区是Range分区的一种变体。可以使用一个或者多个列作为分区键,分区列的数据类型可以是整数(integer)、字符串(CHAR/VARCHAR),DATE和DATETIME。不支持使用任何表达式。和Range分区一样,Range COLUMNS分区同样需要分区的范围是严格递增的。下面通过一个示例来进行演示。
(1)创建一张新的员工表,按照职位和薪水建立Range COLUMNS分区。
ob>createtableemp_range_column(empnoint,enamevarchar(10),jobvarchar(10),mgrint,hiredatevarchar(10),salint,commint,deptnoint)partitionbyrangecolumns(job,sal)(partitionp0valuesless than('CLERK',1000),partitionp1valuesless than('CLERK',3000),partitionp2valuesless than('CLERK',maxvalue),partitionp3valuesless than('SALESMAN',1000),partitionp4valuesless than('SALESMAN',3000),partitionp5valuesless than('SALESMAN',maxvalue));(2)往表中插入数据。
ob>insertintoemp_range_columnselect*fromemp;(3)查询职位是CLERK,且薪水小于2500之间的员工,并查看执行计划。
ob>explainselect*fromemp_rangewherejob='CLERK'andsal<2500;# 提示:从执行计划可以看出,本次查询只扫描分区p0和p1。三、 List分区
List分区和Range分区有很多相似的地方。不同之处主要在于List分区中,对于表的每个分区中包含的所有行,按分区表达式计算的值属于给定的数据集合。每个分区定义的数据集合有任意个值,但不能有重复的值。下面通过一个示例来进行演示。
(1)创建一张新的员工表,按照部门号建立List分区。
ob>createtableemp_list(empnoint,enamevarchar(10),jobvarchar(10),mgrint,hiredatevarchar(10),salint,commint,deptnoint)partitionbylist(deptno)(PARTITIONp0VALUESIN(10,20),PARTITIONp1VALUESIN(30),PARTITIONp2VALUESIN(default));(2)往表中插入数据。
ob>insertintoemp_listselect*fromemp;(3)查询40号部门的员工,并查看执行计划。
ob>explainselect*fromemp_listwheredeptno=30;# 提示:从执行计划可以看出,本次查询只扫描分区p1。四、 List COLUMNS分区
List COLUMNS分区是List分区的一种变体,可以将多个列用作分区键,并且可以将整数类型以外的数据类型的列用作分区列。该分区还可以使用字符串类型、DATE和DATETIME类型的列。下面通过一个示例来进行演示。
(1)创建一张新的员工表,按照薪水建立Range INTERVAL分区。
ob>createtableemp_list_columns(empnoint,enamevarchar(10),jobvarchar(10),mgrint,hiredatevarchar(10),salint,commint,deptnoint)partitionbylistcolumns(job)(PARTITIONp0VALUESIN('MANAGER'),PARTITIONp1VALUESIN('CLERK'),PARTITIONp2VALUESIN('SALESMAN'),PARTITIONp3VALUESIN('ANALYST'),PARTITIONp4VALUESIN('PRESIDENT'));(2)查看表上的分区信息。
ob>showcreatetableemp_list_columns \G;# 输出的信息如下:***************************1.row***************************Table: emp_list_columnsCreateTable:CREATETABLE`emp_list_columns`(`empno`int(11)DEFAULTNULL,`ename`varchar(10)DEFAULTNULL,`job`varchar(10)DEFAULTNULL,`mgr`int(11)DEFAULTNULL,`hiredate`varchar(10)DEFAULTNULL,`sal`int(11)DEFAULTNULL,`comm`int(11)DEFAULTNULL,`deptno`int(11)DEFAULTNULL)ORGANIZATIONINDEXDEFAULTCHARSET=utf8mb4 ROW_FORMAT=DYNAMIC COMPRESSION='zstd_1.3.8'REPLICA_NUM=1BLOCK_SIZE=16384USE_BLOOM_FILTER=FALSEENABLE_MACRO_BLOCK_BLOOM_FILTER=FALSETABLET_SIZE=134217728PCTFREE=0partitionbylistcolumns(job)(partition`p3`valuesin('ANALYST'),partition`p1`valuesin('CLERK'),partition`p0`valuesin('MANAGER'),partition`p4`valuesin('PRESIDENT'),partition`p2`valuesin('SALESMAN'))1rowinset(0.035sec)五、 Hash分区
Hash分区会根据数据的Hash值建立分区,如果数据的Hash值一样,那么数据将会放入同一个分区中。Hash分区主要用于保证数据均匀地分散到一定数量的分区里面。下图解释了Hash分区的原理。
下面的语句将创建一张新的员工表,按照经理号(mgr)建立4个Hash分区。
ob>createtableemp_hash_by_mgr(empnoint,enamevarchar(10),jobvarchar(10),mgrint,hiredatevarchar(10),salint,commint,deptnoint)partitionbyhash(mgr)partitions4;# 提示:如果不指定partitions 4,默认的分区数量为 1。六、 Key分区
Key分区与Hash分区都可以保证将数据均匀地分散到一定数量的分区里面,区别是Hash分区只能根据一个指定的整数表达式或字段进行分区,而Key分区可以根据字段列表进行分区,且Key分区的分区字段不局限于整数类型。创建Key分区表时,你需要在CREATE TABLE后面添加PARTITION BY KEY(columnList),其中columnList是字段列表,可以包含一个或多个字段。每个字段的类型可以是除BLOB、JSON、GEOMETRY之外的任意类型(请注意TiDB不支持GEOMETRY类型)。此外,你很可能还需要加上PARTITIONS num,其中num是一个正整数,表示将表划分多少个分区。下面的语句将创建一个Key分区表,按员工的职位job分成4个分区:
ob>createtableemp_hash_by_job(empnoint,enamevarchar(10),jobvarchar(10),mgrint,hiredatevarchar(10),salint,commint,deptnoint)partitionbykey(job)partitions4;