索引加速
本文主要介绍云数据库 SelectDB 版中内建的智能索引以及使用时的注意事项。
背景信息
索引用于快速过滤或查找数据。目前云数据库 SelectDB 版主要支持两类索引:
内建的智能索引,包括ZoneMap索引和前缀索引。
创建的二级索引,包括倒排索引、Bitmap索引、BloomFilter索引和NGram BloomFilter索引,详情请参考倒排索引、Bitmap索引、BloomFilter索引和NGram BloomFilter索引。
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类型时,前缀索引会直接截断,示例如下。
以下表结构的前缀索引为
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
通过物化视图来调整前缀索引
建表时已经指定了列顺序,所以一个表只有一种前缀索引。这对于使用其他不能命中前缀索引的列作为条件进行的查询来说,效率上可能无法满足需求。因此,可以通过创建物化视图来调整列顺序进而调整前缀索引,详情请参见物化视图。