Doris的表模型和MySQL的存储引擎: innodb,myisam,memeory等功能类似, 不同的表模型擅长处理不同的数据方式. 如何能高效的查询, 直接取决于选择的表模型. 表一旦创建, 表模型不能更改.
在Doris表中, 字段被人为的分为2种: Key和Value. Key也就是俗称的维度, Value是指标. 建表时Key列必须在Value列前面.
AGGREGATE 聚合模型, 聚合模型支持Value列在导入数据时, 按照指定的聚合类型聚合数据, 达到预先聚合数据, 提高查询的目的. 目前Doris支持4种聚合方式: SUM、REPLACE、MAX、MIN, 分别的聚合含义如下:
CREATE TABLE `agg_tbl_demo` (
siteid INT,
city SMALLINT,
username VARCHAR(32),
pv BIGINT SUM DEFAULT '0'
) ENGINE=OLAP
AGGREGATE KEY(siteid, city, username)
DISTRIBUTED BY HASH(`siteid`) BUCKETS 1
PROPERTIES (
"replication_num" = "1"
);
siteid: 表示网站id
city: 访问者所在的城市id
username: 访问者用户名
pv: 访问者pv. 后面的sum表示导入这列数据时, 以siteid,city,username为“主键”, 将导入的每条数据的pv值做sum计算保存.
我们分别添加三条数据, 然后分别观察三条数据的添加结果:
insert into agg_tbl_demo values(100, 200, 'francis', 1);
+--------+------+----------+------+
| siteid | city | username | pv |
+--------+------+----------+------+
| 100 | 200 | francis | 1 |
+--------+------+----------+------+
insert into agg_tbl_demo values(100, 200, 'jim', 1);
+--------+------+----------+------+
| siteid | city | username | pv |
+--------+------+----------+------+
| 100 | 200 | francis | 1 |
| 100 | 200 | jim | 1 |
+--------+------+----------+------+
insert into agg_tbl_demo values(100, 200, 'francis', 1);
, 执行完成后, 看看francis的统计结果, 发现francis的pv由1变成2了. 2=1+1.再想想sum的聚合方式. 是不是有点意思.+--------+------+----------+------+
| siteid | city | username | pv |
+--------+------+----------+------+
| 100 | 200 | francis | 2 |
| 100 | 200 | jim | 1 |
+--------+------+----------+------+
insert into agg_tbl_demo values(100, 200, 'jim', 10);
, 此时看看jim的pv由1变成11了, 11=1+10.再想想sum的聚合方式. 是不是有点意思.+--------+------+----------+------+
| siteid | city | username | pv |
+--------+------+----------+------+
| 100 | 200 | francis | 2 |
| 100 | 200 | jim | 11 |
+--------+------+----------+------+
聚合表模型的好处时可以采用预先聚合的方式, 加快查询速度. 但是原始数据会丢失, 会失去一定的灵活性. 一般比较适用于一些固定报表、固定统计. 比如pv, uv.
UNIQUE 唯一模型, 其实是聚合模型的一个特例, 在唯一模型中, 所有的Value列会按照REPLACE的方式聚合, 也就是除了UNIQUE KEY之外的列, 都是新数据替换旧数据. 唯一模型是解决数据有主键, 除了主键之外的都替换的情况, 同时也可以保存明细.
DUPLICATE 明细模型, 很多时候数据是没有主键、也不需要预先聚合的明细. 这种数据模型区别于 Aggregate 和 Uniq 模型。数据完全按照导入文件中的数据进行存储,不会有任何聚合。即使两行数据完全相同,也都会保留
全部评论