Doris的分区Partition和分桶Bucket介绍

 

Doris数据库是一个分布式的列式存储数据库,它支持分区和分桶两种数据划分方式

  1. 分区:Doris数据库支持水平分区,即将数据按照某个字段的值进行分区,相同的值会被分配到同一个分区中。这种方式可以将数据均匀地分布到不同的节点上,提高查询效率和并行处理能力。
  2. 分桶:Doris数据库支持垂直分桶,即将同一行数据的不同列分别存储在不同的桶中。这种方式可以将经常一起查询的列存储在同一个桶中,提高查询效率。
  3. 节点负载均衡:Doris数据库可以将数据均匀地分布到不同的节点上,保证每个节点的负载均衡,提高系统的可扩展性和稳定性。
  4. 数据压缩:Doris数据库支持多种数据压缩算法,可以将数据在存储时进行压缩,减少存储空间,降低存储成本。
  5. 数据副本:Doris数据库支持数据副本,可以将数据复制到多个节点上,提高系统的容错能力和可用性。

Doris 支持两层的数据划分。第一层是 Partition,支持 Range 和 List 的划分方式。第二层是 Bucket(Tablet),仅支持 Hash 的划分方式。

Doris数据划分也可以仅使用一层分区。使用一层分区时,只支持 Bucket 划分

1. Partition - 分区

 

Partition,支持 Range 和 List

1.1 Range 分区使用介绍

Range分区是一种基于分区键对表进行分区的方式,分区键指的是表中的某一列,而Range则是指这个列的值的范围。使用Range分区,可以将数据按照列的值的范围进行划分,将数据分散到不同的节点上,以实现分布式存储和查询

 

官方示例介绍

1.1.1 建Range Partition测试表

 

如上 example_range_tbl 示例,当建表完成后,会自动生成如下3个分区:

1.1.2 查看分区partition方式

1.1.3 向对应分区插入数据

1.1.4 查询分区内数据

验证数据是否在对应分区内

1.1.5 测试插入无对应分区数据

插入的这条数据,'2017-11-01' 没有对应的分区, 插入不成功, 但不会抛出异常或错误。( 查询结果里没有新插入的这条数据 )

1.1.6 增加一个partition分区

当alter执行完成后,新的分区信息如下:

1.1.7 删除一个partition分区

当alter执行完成后,新的分区信息如下:

注意:

这时其他分区并不会发生变化, p201702和p201705之间就出现了一个空洞: [2017-03-01, 2017-04-01) 即如果导入的数据范围在这个空洞范围内,数据是无法导入的,虽然不会抛出异常或错误,但处于这个空洞区间的数据相当于抹去了。

1.1.8 Range多列分区

建表示例:

在以上示例中,我们指定 date(DATE 类型) 和 id(INT 类型) 作为分区列。以上示例最终得到的分区如下:

最后一个分区用户缺省只指定了 date 列的分区值,所以 id 列的分区值会默认填充 MIN_VALUE。当用户插入数据时,分区列值会按照顺序依次比较,最终得到对应的分区,举例如下:

 

1.2 List 分区使用介绍

 

官方示例介绍

1.2.1 建List Partition测试表

如上 example_list_tbl 示例,当建表完成后,会自动生成如下3个分区:

1.2.2 向对应分区插入数据

1.2.3 查询分区内数据

这里和上方Range分区相同,不展开测试插入删除数据等操作

1.2.4 增加一个子分区

当我们增加一个分区 p_uk VALUES IN ("London"),分区结果如下:

 

2. Bucket - 分桶

 

 

3. 官方关于 Partition 和 Bucket 的数量和数据量的建议

 

4. 复合分区与单分区

复合分区

以下场景推荐使用复合分区

用户也可以不使用复合分区,即使用单分区。则数据只做 HASH 分布。