Doris索引組織方式、查詢與ROLLUP


  1. Doris 前綴索引
    doris不支持在任意列上創建索引,而是按照指定的列對數據進行排序存儲,在這種數據結構上,以排序列作為條件查詢會非常的高效。

在Aggregate,Uniq,Duplicate三種數據模型中,底層的數據存儲,是按照各自建表語句中,AGGREGATE KEY,UNIQ KEY,DUPLICATE KEY中指定的列進行排序存儲。

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 表中保存着按用戶建表語句指定的方式存儲的基礎數據。

在 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的聚合值的時候,可以通過查詢

-- 查詢的依舊是原始表
select siteid,sum(pv) from visit group by siteid;

-- 查詢計划
select siteid,sum(pv) from visit group by siteid;
rollup也是有前綴索引的,sql語句按照前綴匹配對應的rollup,自動去對應的rollup中查詢對應的數據。

因此,我們可以通過創建不同的rollup,來指定不同的排序列的順序,以適應不同的查詢方式。

ROLLUP 是附屬於 Base 表的,可以看做是 Base 表的一種輔助數據結構。用戶可以在 Base 表的基礎上,創建或刪除 ROLLUP,但是不能在查詢中顯式的指定查詢某 ROLLUP。是否命中 ROLLUP 完全由 Doris 系統自動決定。
ROLLUP 的數據是獨立物理存儲的。因此,創建的 ROLLUP 越多,占用的磁盤空間也就越大。同時對導入速度也會有影響,但是不會降低查詢效率;
ROLLUP 的數據更新與 Base 表示完全同步的;
查詢能否命中 ROLLUP 的一個必要條件(非充分條件)是,查詢所涉及的所有列(包括 select list 和 where 中的查詢條件列等)都存在於該 ROLLUP 的列中。否則,查詢只能命中 Base 表。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM