索引加速
本文主要介紹云數(shù)據(jù)庫 SelectDB 版中內(nèi)建的智能索引以及使用時的注意事項。
背景信息
索引用于快速過濾或查找數(shù)據(jù)。目前云數(shù)據(jù)庫 SelectDB 版主要支持兩類索引:
內(nèi)建的智能索引,包括ZoneMap索引和前綴索引。
創(chuàng)建的二級索引,包括倒排索引、Bitmap索引、BloomFilter索引和NGram BloomFilter索引,詳情請參考倒排索引、Bitmap索引、BloomFilter索引和NGram BloomFilter索引。
ZoneMap索引
ZoneMap索引是在列存格式上,對每一列自動維護的索引信息,包括Min/Max,Null值個數(shù)等等。這種索引由云數(shù)據(jù)庫 SelectDB 版自動創(chuàng)建維護。
前綴索引
不同于傳統(tǒng)的數(shù)據(jù)庫設(shè)計,云數(shù)據(jù)庫 SelectDB 版這類 MPP 架構(gòu)的 OLAP 數(shù)據(jù)庫,一般通過提高并發(fā)來處理大量數(shù)據(jù)。同時可結(jié)合一些索引結(jié)構(gòu),來加速查詢性能。
SelectDB的數(shù)據(jù)存儲在類似SSTable(Sorted String Table)的數(shù)據(jù)結(jié)構(gòu)中。該結(jié)構(gòu)是一種有序的數(shù)據(jù)結(jié)構(gòu),可以按照指定的列進行排序存儲。在這種數(shù)據(jù)結(jié)構(gòu)上,以排序列作為條件進行查找,會非常的高效。
在Aggregate、Unique和Duplicate三種數(shù)據(jù)模型中,底層的數(shù)據(jù)存儲是按照各自建表語句中AGGREGATE KEY、UNIQUE KEY和DUPLICATE KEY里指定的列進行排序存儲的。而前綴索引,即在排序的基礎(chǔ)上,實現(xiàn)的一種根據(jù)給定前綴列,快速查詢數(shù)據(jù)的索引方式。
使用示例
將一行數(shù)據(jù)的前36個字節(jié)作為這行數(shù)據(jù)的前綴索引。當遇到VARCHAR類型時,前綴索引會直接截斷,示例如下。
以下表結(jié)構(gòu)的前綴索引為
user_id(8 Bytes)+age(4 Bytes)+message(prefix 20 Bytes)
。ColumnName
Type
user_id
BIGINT
age
INT
message
VARCHAR(100)
max_dwell_time
DATETIME
min_dwell_time
DATETIME
當查詢條件是前綴索引的前綴時,可以極大的加快查詢速度。執(zhí)行如下查詢語句。
示例一:
SELECT * FROM table WHERE user_id=1829239 and age=20;
示例二:
SELECT * FROM table WHERE age=20;
示例一的查詢速度會遠高于示例二的查詢速度。所以在建表時,正確的選擇列順序,能夠極大地提高查詢效率。
以下表結(jié)構(gòu)的前綴索引為
user_name(20 Bytes)
,即使沒有達到36個 Bytes。遇到VARCHAR,所以直接截斷,不再往后繼續(xù)。ColumnName
Type
user_name
VARCHAR(20)
age
INT
message
VARCHAR(100)
max_dwell_time
DATETIME
min_dwell_time
DATETIME
通過物化視圖來調(diào)整前綴索引
建表時已經(jīng)指定了列順序,所以一個表只有一種前綴索引。這對于使用其他不能命中前綴索引的列作為條件進行的查詢來說,效率上可能無法滿足需求。因此,可以通過創(chuàng)建物化視圖來調(diào)整列順序進而調(diào)整前綴索引,詳情請參見物化視圖。