Doris 的聚合模型
Apache Doris 是一个基于MPP架构的高性能、实时的分析数据库,因此比较适合使用在报表分析的场景中
Doris 和 MySQL很像,都是database-table-row
的逻辑描述,doris的数据模型主要分为3类:
- 聚合模型
- 唯一模型(保证Key的唯一性,类似Primary Key,如果重复会仅保留后面插入的数据)
- 重复模型(相较于唯一模型,这里允许key重复的同时,仅根据指定key进行排序)
聚合模型中每个列都分为key类型和 value类型,聚合模型会将数据的中key列相同的数据的value聚合到一起
列名 | 类型 | 聚合方式 | 备注 |
---|---|---|---|
user_id | int | 用户id | |
batch_id | int | 导入批次 | |
city_id | int | 用户城市id | |
sex | int | 性别 | |
age | int | 年龄 | |
update_time | DATETIME | REPLACE | 用户最后一次更改时间 |
max_cost | int | MAX | 用户最大消费 |
count | int | SUM | 用户交互次数 |
聚合模型局限性
聚合模型中展示的是聚合后的数据,一方面我们没法展示非聚合数据,一方面聚合逻辑不够灵活,一旦场景改变(比如记录用户最大消费 -> 用户平均消费),原有表就不满足需求。
因此我们需要既需要有明细表、也需要可以迅速查询到一些聚合数据
物化视图
物化视图可以给予明细表,将预计计算好的数据集,存储在Doris中,查询时,会自动匹配到最优物化视图
假设用户有一个销售记录表,记录售货员,地址、时间、金额等信息,基于此希望对数据进行分析,记录每个用户的消费总金额 那么有sql
SQL
select seller_id, sum(sale_amt) from sales_records group by seller_id
接下来,我们随机插入数据 4718592 条,sql略
如果直接查询,sql耗时为51ms,但是通过建立物化视图:
SQL
create materialized view store_amt as select seller_id, sum(sale_amt) from sales_records group by seller_id;
我们可以将计算好的数据提前存储,在查询时,会自动匹配最优的物化视图。通过这种方式,sql的耗时变成了5ms,直接降低了90%的时间成本。
局限性
- 物化视图不可以包含相同列的多种聚合方式,比如没法在一个物化视图中统计用户的平均消费,最大消费。
- 建立物化视图后不能删除物化视图中不包含的列(尤其是在建立多个物化视图时,这个局限尤为麻烦)
- 建立多个物化视图势必会导入效率。