OceanBase 数据库可以把普通的表的数据按照一定的规则划分到不同的区块内,同一区块的数据物理上存储在一起。这种划分区块的表叫做分区表。
如下例所示,t1 表被划分成了 5 个分区,分布在 2 台机器上。 t1 表的每个分区还能按照一个给定的规则再拆分成多个分区。这种分区表叫做二级分区表。
create table t1 (c1 int, c2 int) partition by hash(c1) partitions 5
如下例所示,每个分区又被拆分成了 3 个子分区。
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
分区键
数据表中每一行中用于计算这一行属于哪一个分区的列的集合叫做分区键。由分区键构成的用于计算这一行属于哪一个分区的表达式叫做分区表达式。
注意
由于 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 一个分区来实现数据过期功能。
提高性能
通过分区裁剪,可以快速定位到用户需要查询的分区,提高查询性能。