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 表。