本文主要介紹ApsaraDB for SelectDB中內部建立的智能索引以及使用時的注意事項。
背景資訊
索引用於快速過濾或尋找資料。目前ApsaraDB for SelectDB主要支援兩類索引:
內建的智能索引,包括ZoneMap索引和首碼索引。
建立的二級索引,包括倒排索引、Bitmap索引、BloomFilter索引和NGram BloomFilter索引,詳情請參考倒排索引、Bitmap索引、BloomFilter索引和NGram BloomFilter索引。
ZoneMap索引
ZoneMap索引是在列存格式上,對每一列自動維護的索引資訊,包括Min/Max,Null值個數等等。這種索引由ApsaraDB for SelectDB自動建立維護。
首碼索引
不同於傳統的資料庫設計,ApsaraDB for SelectDB這類MPP架構的OLAP資料庫,一般通過提高並發來處理大量資料。同時可結合一些索引結構,來加速查詢效能。
ApsaraDB for SelectDB的資料存放區在類似SSTable(Sorted String Table)的資料結構中。該結構是一種有序的資料結構,可以按照指定的列進行排序儲存。在此資料結構上,以排序列作為條件進行尋找時,具有較高查詢效率。
在Aggregate、Unique和Duplicate三種資料模型中,底層的資料存放區是按照各自建表語句中AGGREGATE KEY、UNIQUE KEY和DUPLICATE KEY裡指定的列進行排序儲存的。而首碼索引,即在排序的基礎上,實現的一種根據給定首碼列,快速查詢資料的索引方式。
使用樣本
將一行資料的前36個位元組作為這行資料的首碼索引。當遇到VARCHAR類型時,首碼索引會直接截斷,樣本如下。
以下表結構的首碼索引為
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
當查詢條件是首碼索引的首碼時,可以極大的加快查詢速度。執行如下查詢語句。
樣本一:
SELECT * FROM table WHERE user_id=1829239 and age=20;樣本二:
SELECT * FROM table WHERE age=20;樣本一的查詢速度會遠高於樣本二的查詢速度。所以在建表時,正確的選擇列順序,能夠極大地提高查詢效率。
以下表結構的首碼索引為
user_name(20 Bytes),即使沒有達到36個 Bytes。遇到VARCHAR,所以直接截斷,不再往後繼續。ColumnName
Type
user_name
VARCHAR(20)
age
INT
message
VARCHAR(100)
max_dwell_time
DATETIME
min_dwell_time
DATETIME
通過物化視圖來調整首碼索引
建表時已經指定了列順序,所以一個表只有一種首碼索引。這對於使用其他不能命中首碼索引的列作為條件進行的查詢來說,效率上可能無法滿足需求。因此,可以通過建立物化視圖來調整列順序進而調整首碼索引,詳情請參見物化視圖。