全部產品
Search
文件中心

ApsaraDB for SelectDB:索引加速

更新時間:Mar 18, 2025

本文主要介紹ApsaraDB for SelectDB中內部建立的智能索引以及使用時的注意事項。

背景資訊

索引用於快速過濾或尋找資料。目前ApsaraDB for SelectDB主要支援兩類索引:

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類型時,首碼索引會直接截斷,樣本如下。

  1. 以下表結構的首碼索引為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;

    樣本一的查詢速度會遠高於樣本二的查詢速度。所以在建表時,正確的選擇列順序,能夠極大地提高查詢效率。

  2. 以下表結構的首碼索引為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

通過物化視圖來調整首碼索引

建表時已經指定了列順序,所以一個表只有一種首碼索引。這對於使用其他不能命中首碼索引的列作為條件進行的查詢來說,效率上可能無法滿足需求。因此,可以通過建立物化視圖來調整列順序進而調整首碼索引,詳情請參見物化視圖