Doris进阶——分区与分桶

分区与分桶:

Doris中有两层的数据划分,第一层是分区(Partition),第二层是分桶(Bucket)。

Partition又能分为Range分区和List分区。Bucket仅支持Hash方式。

Partition:

  • 只能指定Key列作为分区列
  • 指定分区值时需要加双引号
  • 理论上分区数量没有上限
  • 在不使用分区建表时,系统会自动创建一个表名一致但是用户不可见的全表分区

Partition_Range:

按照指定范围进行分区,一般生产环境下会使用日期作为分区

  • VALUES LESS THAN (...) :仅指定上界,系统会将前一个分区的上界作为该分区的下界,会生成一个左闭右开的区间
  • VALUES [....) :同时指定上下界,比较好理解,也会生成一个左闭右开的区间
  • 查看Partition的使用命令:HELP PARTITION;

示例:

-- 创建一张Range分区表

CREATE TABLE IF NOT EXISTS test.students2
(
    `sid` LARGEINT NOT NULL COMMENT "学生id",
    `name` VARCHAR(50) NOT NULL COMMENT "学生名字",
    `class` INT COMMENT "学生所在班级",
    `age` SMALLINT COMMENT "学生年龄",
    `sex` TINYINT COMMENT "学生性别",
    `phone` LARGEINT COMMENT "学生电话",
    `address` VARCHAR(500) COMMENT "学生家庭地址",
    `date` DATE NOT NULL COMMENT "数据录入时间"
)
ENGINE=olap
DUPLICATE KEY(`sid`, `name`)
PARTITION BY RANGE(`date`)
(
    PARTITION `d202204` VALUES LESS THAN ("2022-04-01"),
    PARTITION `d202205` VALUES LESS THAN ("2022-05-01"),
    PARTITION `d202206` VALUES LESS THAN ("2022-06-01")
)

DISTRIBUTED BY HASH(`sid`) BUCKETS 8
PROPERTIES
(
    "replication_num" = "3",
    "storage_medium" = "SSD",
    "storage_cooldown_time" = "2022-06-16 12:00:00"
);

  • 查看表的分区SHOW PARTITIONS FROM TABLE; 

Partition_List:

  • 分区支持的数据类型:BOOLEAN, TINYINT, SMALLINT, INT, BIGINT, LARGEINT, DATE, DATETIME, CHAR, VARCHAR
  • 分区值是枚举值,当数据在目标分区枚举值中时,才能命中分区
  • 操作:VALUES IN(....)

示例:

-- 创建一张List分区表

CREATE TABLE IF NOT EXISTS test.students3
(
    `sid` LARGEINT NOT NULL COMMENT "学生id",
    `name` VARCHAR(50) NOT NULL COMMENT "学生名字",
    `class` INT NOT NULL COMMENT "学生所在班级",
    `age` SMALLINT COMMENT "学生年龄",
    `sex` TINYINT COMMENT "学生性别",
    `phone` LARGEINT COMMENT "学生电话",
    `address` VARCHAR(500)  NOT NULL COMMENT "学生家庭地址"
)
ENGINE=olap
DUPLICATE KEY(`sid`, `name`)
PARTITION BY List(`address` )
(
    PARTITION `p_city1` VALUES IN ("浦东","闵行"),
    PARTITION `p_city2` VALUES IN ("海淀","昌平"),
    PARTITION `p_city3` VALUES IN ("太原","忻州")
)

DISTRIBUTED BY HASH(`sid`) BUCKETS 8
PROPERTIES
(
    "replication_num" = "3",
    "storage_medium" = "SSD",
    "storage_cooldown_time" = "2022-06-17 12:00:00"
);

Backet(分桶):

  • 如果创建的表是分区表,那么Backet就是对分区进行Distributed划分,如果不是分区表那么就是对整个表进行划分。
  • 分桶列只能是Key列,分桶列可以和分区列相同或不同。
  • 分桶列的多少取决于对“吞吐”和“并发”的一种权衡。
    • 分桶列多,数据分布的更加均匀,适合大吞吐低并发的查询,不适合高并发的单查询。
    • 分桶列少,适合高并发的点查询。
  • 分桶数量理论上无上限,但是要结合实际资源情况进行设置。

复合分区和单分区:

复合分区:既有分区又有分桶。

单分区:只有分桶。

复合分区的选用场景:

  • 有时间或序值维度的可以使用复合分区。
  • 需要对历史数据进行清理,对N天前的数据进行清理,或者保留N天的数据,可以使用复合分区。
  • 可以解决数据倾斜问题,按天进行分区,那么可能某天的数据量会很大,那么可以调整分桶的数量来达到数据均衡分布的效果,在选着分桶列时要选择数据量差异较大的列。

多列分区:

在指定分区列时,可以在Key中再指定一个字段作为分区列,插入数据时,会首先按照分区列的值依次进行比较

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
对于DorisDB,可以使用分区分桶两种方式进行数据分片和存储。其中,分区是按照数据的某个维度进行划分,而分桶则是将数据均匀地分配到多个桶中进行存储。 对于1亿数据量的DorisDB,建议同时使用分区分桶来进行数据存储,以提高查询性能和可扩展性。 具体的分区分桶策略可以根据数据特点和查询需求来确定。以下是一些常见的分区分桶策略: 1. 按照时间维度进行分区:如果数据具有时间属性,可以按照时间维度进行分区,例如按照年、月、日等进行划分。这样可以提高按时间范围查询的性能。 2. 按照地理位置维度进行分区:如果数据具有地理位置属性,可以按照地理位置维度进行分区,例如按照省、市、区等进行划分。这样可以提高按地理位置查询的性能。 3. 按照业务维度进行分区:如果数据具有不同的业务属性,可以按照业务维度进行分区,例如按照订单类型、商品类型等进行划分。这样可以提高按业务属性查询的性能。 4. 使用哈希分桶进行数据存储:可以使用哈希算法将数据均匀地分配到多个分桶中进行存储,这样可以提高查询性能和可扩展性。例如,可以根据主键或者某个关键字进行哈希分桶。 需要注意的是,在确定分区分桶策略时,需要考虑到数据的分布情况、查询需求和硬件配置等因素,并进行充分的测试和评估,以确定最佳的分区分桶方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小眼睛的Ayuan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值