1. Doris 前缀索引
doris不支持在任意列上建立索引,而是按照指定的列对数据进行排序存储,在这种数据结构上,以排序列做为条件查询会很是的高效。mysql
在Aggregate,Uniq,Duplicate三种数据模型中,底层的数据存储,是按照各自建表语句中,AGGREGATE KEY,UNIQ KEY,DUPLICATE KEY中指定的列进行排序存储。sql
doris建立的索引是稀疏索引,将一行数据按照排序列的顺序进行存储,而后取一行数据中前面很少于36个字节的数据做为索引。所以在查询时。将查询条件按照排序列进行排序,会提升查询效率。一样,建立表的时候字段顺序也应该也应该按照排序列的次序进行排序。数据结构
-- AGGREGATE KEY(siteid, city, username) 排序列的顺序与建立表的字段顺序一致 CREATE TABLE visit ( siteid INT, city SMALLINT, username VARCHAR(32), pv BIGINT SUM DEFAULT '0' ) AGGREGATE KEY(siteid, city, username) DISTRIBUTED BY HASH(siteid) BUCKETS 10 PROPERTIES("replication_num" = "1"); -- 查询条件和排序列的顺序一致 select * from visit where siteid = and city = and username =
2. ROLLUP
在 Doris 中,咱们将用户经过建表语句建立出来的表成为 Base 表(Base Table)。Base 表中保存着按用户建表语句指定的方式存储的基础数据。code
在 Base 表之上,咱们能够建立任意多个 ROLLUP 表。这些 ROLLUP 的数据是基于 Base 表产生的,而且在物理上是独立存储的。Rollup 本质上能够理解为原始表(Base Table)的一个物化索引。创建 Rollup 时可只选取 Base Table 中的部分列做为 Schema。Schema 中的字段顺序也可与 Base Table 不一样。排序
也就是说,rollup表实际上是保存了base表中的一部分字段的数据。例如索引
-- rollup_visit中只保存了siteid这一个维度列以及pv这个value列 alter table visit add rollup rollup_visit(siteid,pv);
这样当咱们按照siteid去统计pv的聚合值的时候,能够经过查询ci
-- 查询的依旧是原始表 select siteid,sum(pv) from visit group by siteid; -- 查询计划 select siteid,sum(pv) from visit group by siteid;
rollup也是有前缀索引的,sql语句按照前缀匹配对应的rollup,自动去对应的rollup中查询对应的数据。同步
所以,咱们能够经过建立不一样的rollup,来指定不一样的排序列的顺序,以适应不一样的查询方式。it
- ROLLUP 是附属于 Base 表的,能够看作是 Base 表的一种辅助数据结构。用户能够在 Base 表的基础上,建立或删除 ROLLUP,可是不能在查询中显式的指定查询某 ROLLUP。是否命中 ROLLUP 彻底由 Doris 系统自动决定。
- ROLLUP 的数据是独立物理存储的。所以,建立的 ROLLUP 越多,占用的磁盘空间也就越大。同时对导入速度也会有影响,可是不会下降查询效率;
- ROLLUP 的数据更新与 Base 表示彻底同步的;
- 查询可否命中 ROLLUP 的一个必要条件(非充分条件)是,查询所涉及的全部列(包括 select list 和 where 中的查询条件列等)都存在于该 ROLLUP 的列中。不然,查询只能命中 Base 表。