Doris进阶——Rollup和前缀索引

Rollup

Doris中通过建表语句创建的表是Base表,也就是基础表,通过建表语句指定大的方式来存储基础数据。

在Base表上可以存储创建多个Rollup表,Rollup表依赖于Base表的数据,且是单独物理存储的,所以创建太多会占用资源空间。

Rollup作用:Rollup是在Base表的基础上获得更粗粒度的聚合数据。在不同数据模型中会有不同的作用。

  • Rollup的根本作用就是提升某些查询的查询效率,也称为物化索引。
  • Rollup属于Base表,Base表可以增删Rollup,Rollup完全和Base表同步更新,Base表数据发生变化,Rollup也会跟随Base表变化。
  • Rollup完全独立存储,因此要考虑存储问题。
  • Rollup中的聚合方式也和Base表完全一致,创建Rollup时无需指定聚合方式,也不能改变原有的聚合方式。
  • Rollup的命中条件:查询的所涉及的列必须在Rollup中,否则只能查询Base表。且Rollup会自己实现命中。

Aggregate和Unique中的Rollup:

由于Unique是Aggregate中的一种特殊的形式且底层也是使用Aggregate中的替换函数实现的,所以这里只看Aggregate模型。

示例:

​
CREATE TABLE IF NOT EXISTS test.aggregate_test1
(
    `user_id` LARGEINT NOT NULL COMMENT "用户id",
    `city` VARCHAR(20) COMMENT "所在城市",
    `date` DATE NOT NULL COMMENT "数据插入时间",
    `age` SMALLINT COMMENT "用户年龄",
`last_date` DATETIME REPLACE DEFAULT "2022-01-01 00:00:00" COMMENT "用户最后一次访问时间",
`last_date_not_null` DATETIME REPLACE_IF_NOT_NULL DEFAULT "2022-01-01 00:00:00" COMMENT "用户最后一次访问时间",
 
    `cost` BIGINT SUM DEFAULT "0" COMMENT "总消费",
    `max_dwell_time` INT MAX DEFAULT "0" COMMENT "最大停留时间",
    `min_dwell_time` INT MIN DEFAULT "0" COMMENT "最小停留时间"
)
AGGREGATE KEY(`user_id`, `city`, `date`, `age`)
DISTRIBUTED BY HASH(`user_id`) BUCKETS 8;
 
-- 插入数据(不推荐insert 插入,只做测试用)
insert into test.aggregate_test1 values\
(10000,'北京','2022-04-01',20,'2022-10-01 06:00:00','2022-10-01 06:00:00',20,10,10),\
(10000,'北京','2022-04-01',20,'2022-10-01 07:00:00','2022-10-01 07:00:00',15,2,2),\
(10001,'北京','2022-04-01',30,'2022-10-01 17:05:45','2022-10-01 07:00:00',2,22,22),\
(10002,'上海','2022-04-02',20,'2022-10-02 12:59:12',null,200,5,5),\
(10003,'广州','2022-04-02',32,'2022-10-02 11:20:00','2022-10-02 11:20:00',30,11,11),\
(10004,'深圳','2022-04-01',35,'2022-10-01 10:00:15','2022-10-01 10:00:15',100,3,3),\
(10004,'深圳','2022-04-03',35,'2022-10-03 10:20:22','2022-10-03 10:20:22',11,6,6);

命令:

  • 查看表结构信息 :DESC TABLE ALL;
  • 添加 Rollup 表(需要查看用户的总消费):ALTER TABLE aggregate_test1 ADD  ROLLUP  rollup_test (uid,cost);
  • 可以通过EXPLAIN来查看执行计划图:EXPLAIN SELECT  user_id , sum(cost) FROM aggregate_test1 ;
  • 查看Rollup是否创建成功:SHOW ALTER TABLE ROLLUP;

  • 执行普通语法:explain select user_id,cost from aggregate_test1 ;
  •  执行聚合语法:explain select user_id,sum(cost) from aggregate_test1 group by user_id ;

Duplicate模型中的Rollup:

由于Duplicate模型中没有前缀索引,因此,只能使用Rollup进行列调整,来命中前缀索引。

前缀索引:

Doris和传统数据库不同,Doris这种MPP架构的数据库不支持在任意列上创建索引。

Doris的数据存储在SSTable这种数据结构上,该数据结构以排序列作为条件查询会非常高效。

前缀索引就是在列排序的基础上,根据给定前缀列,快速查询数据的索引方式。

前缀索引的设置,将一行数据的前36字节作为当前行的前缀索引,在遇到VARCHAR数据类型会前缀索引会直接截断。

比如一张表中的字段和数据类型是:uid BIGINT , age INT , name VARCHAR(50) 

那么这张表的前缀索引就是:uid (8 byte) + age (4 byte)  + name (20 byte)

比如这张表的字段和数据类型顺序是:name VARCHAR(50) ,uid BIGINT , age INT

那么这张表的前缀索引是:name(20byte) 会从一开始就截断

在查询时使用前缀索引的前缀进行查询会极大的提高查询效率

通过Rollup实现前缀索引的列排序:

可以通过在Base表上添加Rollup的方式重新调整列的排序,来达到调整前缀索引的目的。

而且在查询时还会优先匹配Rollup,因为前缀索引匹配度高。

请参考官网:Doris官网——Rollup

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小眼睛的Ayuan

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

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

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

打赏作者

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

抵扣说明:

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

余额充值