索引加速

更新时间: 2024-03-13 18:32:38

本文主要介绍云数据库 SelectDB 版中内建的智能索引以及使用时的注意事项。

背景信息

索引用于快速过滤或查找数据。目前云数据库 SelectDB 版主要支持两类索引:

ZoneMap索引

ZoneMap索引是在列存格式上,对每一列自动维护的索引信息,包括Min/Max,Null值个数等等。这种索引由云数据库 SelectDB 版自动创建维护

前缀索引

不同于传统的数据库设计,云数据库 SelectDB 版这类 MPP 架构的 OLAP 数据库,一般通过提高并发来处理大量数据。同时可结合一些索引结构,来加速查询性能。

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

通过物化视图来调整前缀索引

建表时已经指定了列顺序,所以一个表只有一种前缀索引。这对于使用其他不能命中前缀索引的列作为条件进行的查询来说,效率上可能无法满足需求。因此,可以通过创建物化视图来调整列顺序进而调整前缀索引,详情请参见物化视图