帮你快速理解、总结文档立即下载

索引

最近更新时间:2026-07-06 11:20:30

我的收藏

概述

索引有助于快速定位到满足查询条件的数据。具体来说,如果表中基于一些列构建了索引,那么查询时如果能用上这些索引,就不需要扫描全表,只需要读取部分数据,就能快速定位到满足条件的数据的位置,从而提高查询效率。StarRocks 提供了丰富的索引类型,主要分为以下两类:
StarRocks 自动创建的索引,称为内置索引,包括前缀索引、Ordinal 索引、ZoneMap 索引。
StarRocks 同时也支持用户手动创建索引,包括 Bitmap 索引和 Bloom filter 索引。

内置索引

前缀索引

数据写入时候自动生成前缀索引。具体来说,写入时数据按照指定的排序键排序,并且每写入 1024 行数据构成一个逻辑数据块(Data Block),在前缀索引表中存储一个索引项,内容为该逻辑数据块中第一行数据的排序列组成的前缀。 当查询的过滤条件命中前缀索引的前缀,则可以快速定位符合条件的数据,减少扫描的数据量,从而查询性能可以得到显著提升。
注意:
排序列的数据类型:
主键表的排序列支持数值(包括整型、布尔)、字符串、时间日期类型。
明细表、聚合表和更新表的排序列支持数值(包括整型、布尔、Decimal)、字符串、时间日期类型。
聚合表和更新表中,排序列必须定义在其他列之前。
前缀字段的数量不超过 3 个,前缀索引项的最大长度为 36 字节。
前缀字段中 CHAR、VARCHAR、STRING 类型的列只能出现一次,并且处在末尾位置。

示例

创建一个表,使用 ORDER BY 定义排序键为 uidage。建表后可以通过查询前缀索引的前缀加快查询速度。
--建表
CREATE TABLE user_access (
uid int,
name varchar(64),
age int,
phone varchar(16),
last_access datetime,
credits double
)
ORDER BY (uid, age);

--快速查询
SELECT * FROM user_access WHERE age=18

Ordinal 索引

底层存储数据时,StarRocks 实际上采用列式存储。每一列数据以 Data Page 为单位分块存储,每个 Data Page 大小一般为 64*1024 个字节(data_page_size = 64 * 1024)。每一列 Date Page 会对应生成一条 Ordinal 索引项,记录 Data Page 的起始行号等信息。这样 Ordinal 索引提供了通过行号来查找列 Data Page 数据页的物理地址。其他索引查找数据时,最终都要通过 Ordinal 索引查找列 Data Page 的位置。

ZoneMap 索引

ZoneMap 索引存储了每块数据统计信息,统计信息包括 Min 最小值、Max 最大值、HasNull 空值、HasNotNull 不全为空的信息。在查询时,StarRocks 可以根据这些统计信息,快速判断这些数据块是否可以过滤掉,从而减少扫描数据量,提升查询速度。

手动创建的索引

如果查询条件中的列不是前缀字段,您可以根据数据和查询特点,为该列手动创建索引来提高查询效率。

Bitmap 索引

Bitmap 索引适用于较高基数列的查询和多个低基数列的组合查询,并且此时 Bitmap 索引对查询的过滤效果比较好,至少可以过滤掉 999/1000 的数据。

示例

-- 建表时创建 Bitmap 索引
CREATE TABLE `lineorder_partial` (
`lo_orderkey` int(11) NOT NULL COMMENT "",
`lo_orderdate` int(11) NOT NULL COMMENT "",
`lo_orderpriority` varchar(16) NOT NULL COMMENT "",
`lo_quantity` int(11) NOT NULL COMMENT "",
`lo_revenue` int(11) NOT NULL COMMENT "",
INDEX lo_orderdate_index (lo_orderdate) USING BITMAP
) ENGINE=OLAP
DUPLICATE KEY(`lo_orderkey`)
DISTRIBUTED BY HASH(`lo_orderkey`) BUCKETS 1;

-- 建表后创建 Bitmap 索引
CREATE INDEX lo_quantity_index ON lineorder_partial (lo_quantity) USING BITMAP;

-- 删除索引
DROP INDEX index_name ON [db_name.]table_name;

Bloom filter 索引

Bloom filter 索引适用于基数较高的列,例如 ID 列,但是存在一定的误判率。

示例

-- 建表时创建索引
CREATE TABLE table1
(
k1 BIGINT,
k2 LARGEINT,
v1 VARCHAR(2048) REPLACE,
v2 SMALLINT DEFAULT "10"
)
ENGINE = olap
PRIMARY KEY(k1, k2)
DISTRIBUTED BY HASH (k1, k2)
PROPERTIES("bloom_filter_columns" = "k1,k2");

-- 查看索引
SHOW CREATE TABLE table1;

-- 修改索引
ALTER TABLE table1 SET ("bloom_filter_columns" = "k1,k2,v1");
ALTER TABLE table1 SET ("bloom_filter_columns" = "k1");
ALTER TABLE table1 SET ("bloom_filter_columns" = "");