1. 程式人生 > 其它 >Doris索引組織方式、查詢與ROLLUP

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