基本概述
OceanBase可以把普通的表的数据按照一定的规则划分到不同的区块内,同一区块的数据物理上存储在一起。这种划分区块的表叫做分区表。示例:
create table t1 (c1 int, c2 int) partition by hash(c1) partitions 5
如图,t1表被划分成了5个分区,分布在2台机器上。
上例中的t1表的每个分区还能按照一个给定的规则再拆分成多个分区。这种分区表叫做二级分区表。例如:
create table t1 (c1 int, c2 int) partition by hash(c1)
subpartition by range(c2)
subpartition template (
subpartition sp0 values less than(100),
subpartition sp1 values less than(200),
subpartition sp2 values less than(maxvalue)
) partitions 5
示例中的每个分区又被拆分成了3个子分区。
分区键
数据表中每一行中用于计算这一行属于哪一个分区的列的集合叫做分区键。由分区键构成的用于计算这一行属于哪一个分区的表达式叫做分区表达式。
说明
注意: 由于OceanBase的表是索引组织表(IOT),为了保证主键的含义:给定主键的查询能很快定位到所在的分区。所以分区键必须是主键的子集。如果这个表里面还含有唯一索引,那么分区键就必须是所有唯一索引列(包括主键列)交集的子集。 Oracle的IOT表和索引分区也有这个要求,对表没这个要求。
局部索引
局部索引是局限在单个分区内的索引。对于非分区的普通表,它的索引存储是整个表的行按照索引键进行排序后的结果。对于分区表的局部索引是每个分区分别自己存储自己的行按照索引键进行排序后的结果,不是全局有序的。创建语句中需要带local关键字,举个例子:
create table t1 (c1 int, c2 int) partition by hash(c1) partitions 5;
create index i1 on t1(c2) local;
说明
注意: 查询的时候条件里面通常需要给定查询分区键。如果不给定分区键,也能用上局部索引,但是可能需要扫描所有的分区。
分区的好处
提高可扩展性。分区表的不同分区可以分布在不同的机器上,使得单表能获得多机的处理能力,并且使得单表的容量可以超过单机的容量。
提高可管理性。对于数据操作的粒度可以控制在单个分区。例如按照时间分区的数据,可以通过drop一个分区来实现数据过期功能。
提高性能。通过分区裁剪,可以快速定位到用户需要查询的分区。提高查询性能。