ByteHouse 企业版提供了一种二级索引——跳数索引,支持在建表后异步添加。该特性解决了排序索引仅能在建表时设置的局限,让索引调整更具灵活性,助力您更便捷地实现查询加速。本文将围绕跳数索引的基本概念与使用方法展开介绍。
ByteHouse MergeTree 家族表引擎在建表阶段支持配置排序索引。当查询条件包含排序索引字段时,系统可预先过滤数据,减少 IO 消耗,以实现查询加速。但排序索引存在局限性,仅支持在建表时设置,建表后无法调整,灵活性不足。为此,ByteHouse 提供跳数索引这一二级索引类型,支持在建表后异步添加。它的原理与排序索引相近,同样是在字段上构建稀疏索引,从而在查询过程中实现部分数据裁剪。尽管跳数索引的查询加速效果不及排序索引,但凭借其灵活调整的特性,仍在实际场景中发挥着广泛作用。
常用的跳数索引类型说明如下:
索引类型 | 说明 |
|---|---|
| 轻量级索引,无需设置额外的参数。 |
| 轻量级索引,用于存储数据块中的所有值,支持设置单个参数,即每个数据块的值集的最大大小。当该参数设置为 0 时,允许存储无限数量的离散值。如果数据块中值的数量超过该最大容量,索引将为空。 |
| 布隆过滤器是一种数据结构,可在允许轻微误报的前提下,实现高效的集合成员测试。由于布隆过滤器能更高效处理大量离散值的测试场景,因此,它适用于需匹配较多测试值的条件表达式,且支持应用于数组。基于布隆过滤器的跳数索引包含以下三种类型: |
| |
| |
|
除上述各跳数索引类型中提及的专属参数外,所有跳数索引均支持配置 GRANULARITY(索引粒度)参数,通常建议将 GRANULARITY 设为 1,以获取更高的数据过滤率;若调整 GRANULARITY 至更大数值,虽能减少索引的存储占用,但相应的数据过滤效果可能会随之减弱。当前该参数支持的配置范围为 1~10。
minmax 索引或 bloom_filter 索引;bloom_filter 索引,建议配置误报率 0.1,即 bloom_filter(0.1),操作便捷高效;ngrambf_v1 索引,建议参数配置为:ngrambf_v1(2/3, 4096/8192, x, 0)。-- 添加 minmax 类型索引 ALTER TABLE skiptest on cluster {cluster_name} ADD INDEX index_name column_name TYPE minmax GRANULARITY 1; -- 添加 tokenbf_v1 类型索引 ALTER TABLE skiptest on cluster {cluster_name} ADD INDEX index_name column_name TYPE tokenbf_v1(4096, 3, 0) GRANULARITY 1; -- 添加 ngrambf_v1 类型索引 ALTER TABLE skiptest on cluster {cluster_name} ADD INDEX index_name column_name TYPE ngrambf_v1(3, 4096, 3, 0) GRANULARITY 1; -- 添加 set 类型索引 ALTER TABLE skiptest on cluster {cluster_name} ADD INDEX index_name column_name TYPE set(0) GRANULARITY 1; -- 添加 bloom_filter 类型索引 ALTER TABLE skiptest on cluster {cluster_name} ADD INDEX index_name column_name TYPE bloom_filter(0.1) GRANULARITY 1;
ALTER TABLE skiptest on cluster {cluster_name} DROP INDEX index_name
-- 在表结构中添加: INDEX index_name column_name TYPE bloom_filter(0.1) GRANULARITY 1; -- 例如: CREATE TABLE default.test_skip_index ( `id` UInt16, `name` String, INDEX name_idx name TYPE bloom_filter(0.1) GRANULARITY 1 ) ENGINE = MergeTree ORDER BY id SETTINGS index_granularity = 8192;
ALTER TABLE skipindex on cluster {cluster_name} MATERIALIZE INDEX index_name;