Doris索引组织方式、查询与ROLLUP

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 表。
相关文章
相关标签/搜索