大数据分析——Apache Doris(三十四)

135 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第17天,点击查看活动详情

l Doris索引是固定的前缀索引,用rollup改变索引顺序

因为建表时已经指定了列顺序,所以一个表只有一种前缀索引。这对于使用其他不能命中前缀索引的列作为条件进行的查询来说,效率上可能无法满足需求。因此,我们可以通过创建 ROLLUP 来人为的调整列顺序。

Base 表结构如下:

列名类型
user_idBIGINT
ageINT
messageVARCHAR(100)
max_dwell_timeDATETIME
min_dwell_timeDATETIME

我们可以在此基础上创建一个 ROLLUP 表:

列名类型
ageINT
user_idBIGINT
messageVARCHAR(100)
max_dwell_timeDATETIME
min_dwell_timeDATETIME

可以看到,ROLLUP 和 Base 表的列完全一样,只是将 user_id 和 age 的顺序调换了。那么当我们进行如下查询时:

SELECT  *  FROM table where age**=**20 and message LIKE "%error%" ;

会优先选择 ROLLUP 表,因为 ROLLUP 的前缀索引匹配度更高。

 Aggregate 和 Uniq 模型中的 ROLLUP

因为 Uniq 只是 Aggregate 模型的一个特例,所以这里我们不加以区别。

  • 示例1:获得每个用户的总消费

接Aggregate 模型小节的示例2,Base 表结构如下:

可以看到,ROLLUP 中仅保留了每个 user_id,在 cost 列上的 SUM 的结果。那么当我们进行如下查询时:

SELECT user_id ,  sum ( cost )  FROM table GROUP BY user_id ;

Doris 会自动命中这个 ROLLUP 表,从而只需扫描极少的数据量,即可完成这次聚合查询。

  • 示例2:获得不同城市,不同年龄段用户的总消费、最长和最短页面驻留时间

紧接示例1。我们在 Base 表基础之上,再创建一个 ROLLUP:

当我们进行如下这些查询时:

SELECT city ,  age ,  sum ( cost ),  max ( max_dwell_time ),  min ( min_dwell_time )  FROM table GROUP BY city ,  age ;

SELECT city ,  sum ( cost ),  max ( max_dwell_time ),  min ( min_dwell_time )  FROM table GROUP BY city ;

SELECT city ,  age ,  sum ( cost ),  min ( min_dwell_time )  FROM table GROUP BY city ,  age ;

Doris 会自动命中这个 ROLLUP 表。

 物化视图

物化视图是将预先计算(根据定义好的 SELECT 语句)好的数据集,存储在 Doris 中的一个特殊的表。

物化视图的出现主要是为了满足用户,既能对原始明细数据的任意维度分析,也能快速的对固定维度进行分析查询。

首先,什么是物化视图?

从定义上来说,就是包含了查询结果的数据库对象,可能是对远程数据的本地Copy;也可能是一个表或多表Join后结果的行或列的子集;也可能是聚合后的结果。说白了,就是预先存储查询结果的一种数据库对象。