首批通过分布式安全可靠测评,为关键业务系统打造
列 Skip Index 属性
更新时间:2026-03-17 16:53:38
Data Skipping 是一种在存储层执行计算来尝试跳过不必要的 IO 的优化方法,Skip Index 则是通过存储预聚合数据提供 Data Skipping 能力的稀疏索引结构,以此来提高查询效率。Skip Index 通过对索引树存储的元数据进行扩展,新增列级别的元数据字段,来对索引节点对应 Range 内指定列数据的最大值/最小值/null count/sum 等进行聚合并存储,在执行下压的表达式计算时通过索引上的聚合数据对数据进行动态剪裁来降低扫描过程中的开销。Skip Index 是列的一种属性,可通过 DESC table_name 或 SHOW CREATE TABLE table_name 命令查看表的列属性。
说明
预聚合的本质在于将查询执行阶段的计算提前至数据写入阶段,通过存储预计算的结果来帮助提高查询效率。同时这种方法需要 Compaction 任务进行额外的计算,预聚合的数据也会消耗存储空间。Skip Index 存储在基线数据上,预聚合对应的 Range 内数据发生更新会导致预聚合数据失效,因此频繁的随机更新会导致 Skip Index 失效,降低优化效果。
Skip Index 的 DDL 行为
Skip Index 数据的维护会在合并时在基线数据上完成,所有聚合数据更新的 DDL 动作目前都要依赖渐进合并。即 Skip Index 是可以部分生效,例如在某一列上新建一个 Skip Index,每当完成一次合并,被新写入的数据上的 Skip Index 都是生效的。当完成一轮全量合并后,所有数据被重写,则 Skip Index 对这一列所有数据都会生效。
Skip Index 是一种可以通过 Online DDL 操作来应用的列属性。
一列所能拥有的 Skip Index 属性受该列数据类型和特征的限制。有级联关系的列会继承相应的聚合属性,例如索引列。
在为列添加 Skip Index 属性时,若发现单个表的 Skip Index 的大小可能会超出存储支持的最大限制,系统将报出错误。使用 Skip Index 是一种以空间换取时间的优化策略,因此在决定为特定列添加 Skip Index 属性时,需要确保此操作对查询性能有实际意义,以免浪费存储资源。
Skip Index 使用限制
JSON 和空间数据类型的列禁止创建 Skip Index。
对于非数值类型的列禁止创建
SUM类型的 Skip Index。数值类型包括:整数类型、定点类型和浮点类型(Bit-Value 类型不支持)。生成列禁止创建 Skip Index。
标识 Skip Index 方法
说明
- 行存表不会默认创建任何类型的 Skip Index,列存表会默认创建
MIN_MAX类型的 Skip Index。 - 对于系统默认创建的 Skip Index 属性,通过
DESC table_name或SHOW CREATE TABLE table_name命令查看表的列属性时,Skip Index 属性不会展示出来。 - 列存表会默认创建
MIN_MAX类型的 Skip Index,而未默认创建SUM类型的 Skip Index,是因为SUM类型的 Skip Index 对旁路导入以及合并任务的性能会有一定影响,如果创建SUM类型的 Skip Index 对查询性能能带来优化,用户可以考虑显示创建SUM类型的 Skip Index 来加速查询,但是如果对查询性能没有优化,建议用户删除SUM类型的 Skip Index。
通过指定 SKIP_INDEX(skip_index_option) 标识列的 Skip Index 属性。skip_index_option 取值如下:
MIN_MAX:是 Skip Index 中最通用的聚合数据类型,它会在索引节点粒度下存储被索引列的最大值、最小值和 Null Count。这种类型的数据可以加速下推的 Filter 和MIN/MAX聚合的下推。SUM:用于加速数值类型的SUM聚合的下推。MIN_MAX, SUM:同时使用MIN_MAX和SUM聚合的 Skip Index 类型。
有关 Skip Index 属性更改的信息请参见 更改表。
示例
创建表时标识列 Skip Index 属性。
CREATE TABLE test_skidx(
col1 INT SKIP_INDEX(MIN_MAX, SUM),
col2 FLOAT SKIP_INDEX(MIN_MAX),
col3 VARCHAR(1024) SKIP_INDEX(MIN_MAX),
col4 CHAR(10)
);