持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第17天,点击查看活动详情
l Doris索引是固定的前缀索引,用rollup改变索引顺序
因为建表时已经指定了列顺序,所以一个表只有一种前缀索引。这对于使用其他不能命中前缀索引的列作为条件进行的查询来说,效率上可能无法满足需求。因此,我们可以通过创建 ROLLUP 来人为的调整列顺序。
Base 表结构如下:
| 列名 | 类型 |
|---|---|
| user_id | BIGINT |
| age | INT |
| message | VARCHAR(100) |
| max_dwell_time | DATETIME |
| min_dwell_time | DATETIME |
我们可以在此基础上创建一个 ROLLUP 表:
| 列名 | 类型 |
|---|---|
| age | INT |
| user_id | BIGINT |
| message | VARCHAR(100) |
| max_dwell_time | DATETIME |
| min_dwell_time | DATETIME |
可以看到,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后结果的行或列的子集;也可能是聚合后的结果。说白了,就是预先存储查询结果的一种数据库对象。