索引
索引可以帮助快速定位符合特定查询条件的数据。 具体来说,当基于表的某些列在表上构建索引时,使用这些列作为查询条件的查询只需要扫描部分表数据即可定位满足条件的数据。 这样,查询效率就提高了。 StarRocks 提供了多种索引类型,主要分为以下两类
- StarRocks 提供内置索引,这些索引由系统自动创建,包括前缀索引、Ordinal 索引和 ZoneMap 索引。
- StarRocks 还允许用户手动创建索引,包括 Bitmap 索引和 Bloom filter 索引。
内置索引
前缀索引
前缀索引在数据写入期间自动生成。 更具体地说,当数据写入 StarRocks 时,数据会根据指定的排序键进行排序,每 1024 行数据包含在一个逻辑数据块中。 由该逻辑数据块中第一行数据的排序键列的值组成的索引条目将添加到前缀索引表中。 当查询中的过滤条件与前缀索引的前缀匹配时,前缀索引可以快速定位满足条件的数据,减少扫描的数据量,从而显着提高查询性能。
Ordinal 索引
StarRocks 实际上在底层存储中采用列式存储。 每列的数据存储在数据页中,每个数据页的大小通常为 64 * 1024 字节 (data_page_size = 64 * 1024)。 在生成数据页的同时添加一个 Ordinal 索引条目。 Ordinal 索引条目包含数据页的起始行号等信息。 这样,Ordinal 索引就可以通过行号定位列数据页的物理地址。
ZoneMap 索引
ZoneMap 索引存储每个数据块的统计信息,包括 Min(最大值)、Max(最小值)、HasNull(是否存在空值)和 HasNotNull(是否存在非空值)信息。 在查询期间,StarRocks 可以根据这些数据块的统计信息快速评估是否可以过滤掉它们,从而减少扫描的数据量并提高查询速度。
更多信息
每个数据块可以是一个 Segment,也可以是一列的数据页。 因此,相应地存在两种类型的 ZoneMap 索引:一种存储每个 Segment 的统计信息,另一种存储一列的每个数据页的统计信息。
手动创建的索引
如果查询条件中的列不是前缀字段,您可以根据数据和查询的特征手动为此列创建索引,以提高查询效率。
Bitmap 索引
Bitmap 索引适用于高基数列或多个低基数列的组合的查询。 对于这些查询,Bitmap 索引可以表现出理想的过滤性能,至少可以过滤掉 1000 行中的 999 行。
Bloom filter 索引
Bloom filter 索引适用于基数相对较高的列,例如 ID 列,但可能会产生一定的误判率。
N-Gram Bloom filter 索引
N-gram Bloom filter 索引是一种特殊的 Bloom filter 索引,通常用于加速 LIKE
查询或 ngram_search
和 ngram_search_case_insensitive
函数的操作。
全文倒排索引
全文倒排索引可以快速定位与关键字匹配的数据行,从而加速全文搜索。