ByteHouse 提供了一种二级索引——跳数索引,可以在建表后异步添加。解决了排序索引只能在建表时设置的缺陷,使调整更加灵活,让用户更加便利的加速查询。
ByteHouse MergeTree 家族的表引擎在建表时可以添加排序索引,若查询条件中包含排序索引中的字段,可以预先过滤数据,减少 IO 以加速查询;但排序索引只能在建表时设置,在建表之后无法调整,因此不够灵活。
因此,ByteHouse 提供了一种二级索引——跳数索引。可以在建表后异步添加。其原理与排序索引类似,也是在字段上添加稀疏索引,使得查询时可以裁剪部分数据。跳数索引效果不如排序索引,但仍因其灵活性发或者广泛的作用。
几种常用的索引类型,如下:
tokenbf_v1
。此索引仅适用于String、FixedString和Map数据类型。输入表达式被分割为由非字母数字字符分隔的字符序列。例如,列值 "This is a candidate for a 'full text' search" 将包含词条 "This is a candidate for full text search"。它适用于LIKE、EQUALS、IN、hasToken()及类似搜索中用于在较长字符串中搜索单词和其他值。它接受三个参数:
ngrambf_v1
。此索引在布隆过滤器设置之前接受一个额外的参数,即要索引的ngram的大小。ngram是任何字符的长度为n的字符字符串,因此字符串 "A short string with an ngram size of 4" 将被索引为: 'A sh'、' sho'、'shor'、'hort'、'ort '、'rt s'、't st'、' str'、'stri'、'trin'、'ring'。这个索引也可以用于文本搜索,特别是对于没有单词间隔的语言,如中文。使用时需要在配置(users.xml)中添加:
set allow_experimental_data_skipping_indices = 1;
-- 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 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;
ngrambf_v1(2/3, 4096/8192, x, 0)
。