clickhouse数据库索引优化与说明(跳数索引、二级索引)(3)

本文详细介绍了ClickHouse数据库的常量体系,包括主索引文件、列数据存储和列标记文件。着重讨论了跳数索引的概念、创建语法及不同类型的跳数索引,如minmax、set和BloomFilter。这些索引类型有助于提高列式数据库的检索效率。同时,文章指出,选择和优化跳数索引需考虑数据结构和分布,以及与主键的相关性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

常量体系介绍
文件类型
primary.idx #主索引文件
*.bin #列数据存储文件
*.mrk #列标记文件
skpidx{index_name}.idx #包含有序的表达式值。
skpidx{index_name}.mrk2 #包含关联数据列文件中的相应偏移量。

创建表语法关键字
PRIMARY KEY ( ) #定义主索引字段;
index_granularity #主索引分组情况;每组长度;
index_granularity_bytes # 设置为0表示禁止自适应分组长度;
ORDER BY #表中需要排序的字段;

跳数索引
clickhouse数据库为列式数据库;其本身并没传统关系型数据库 中所指的二级索引; clickhouse提供了一种适用于列存检索的 跳数索引算法 来替代二级索引;
跳数(跳过)索引使得在特定数据结构(主索引各列排序对数据分布的影响)下可以显著提高检索速度;因为跳数索引 可以跳过那些没有检索对象的分组数据;

ALTER TABLE 
skip_table  
ADD INDEX vix my_column 
TYPE set(100) 
GRANULARITY 2;
skip_table   添加索引的表名称;
vix  索引文件名称;  在删除或具体化索引时,它需要作为参数
my_column  索引的表达式,用于计算存储在索引中的值;可以是列、简单操作符、函数的子集的组合
set(**)  索引的类型;用于控制计算,该计算决定是否可以跳过读取和计算每个索引块
GRANULARITY  索引块中包含多少个分组;如一个分组包含2行;GRANULARITY  为5;则 索引块中包含5个分组(10行)

跳数索引文件
skpidx{index_name}.idx ;包含有序的表达式值;可以理解为跳数索引 基于主索引文件生成的跳数索引文件;
skpidx{index_name}.mrk2 ;包含关联数据列文件中的相应偏移量 ;

上边跳数索引创建之后会生成以下文件:

skp_idx_vix.idx
skp_idx_vix.mrk2

跳数索引类型

索引的类型

minmax:

ALTER TABLE  skip_table   ADD INDEX vix my_column  TYPE minmax GRANULARITY 2;

此类型值没有参数;它存储每个块的索引表达式的最小值和最大值;如果表达式是一个元组,它分别存储元组元素的每个成员的值;

** set**

ALTER TABLE  skip_table   ADD INDEX vix my_column  TYPE set(200) GRANULARITY 2;

此类型接收一个参数:max_size(每个块的值集数量);这个集合包含块中的所有值(如果值的数量超过max_size则为空);适用于块中包含多重复值的数据;

Bloom Filter Types
Bloom Filter 为一种判断集合中是否存在某个值的一个算法;该算法只能肯定 集合中一定不存在某个值;但不能肯定集合中一定存在某个值;可能存在某个值 = 该值也可能不存在(假包含);
Bloom Filter 有三种类型:

1、bloom_filter

ALTER TABLE  skip_table   ADD INDEX vix my_column  TYPE bloom_filter(0.25) GRANULARITY 2;

此类型接受一个可选参数,该参数表示在0到1之间;用于设置假包含率;

2、tokenbf_v1

此类型接受三个参数;
(1)过滤器的大小(以字节为单位)(较大的过滤器具有较少的误报,在存储中需要一些成本),(2)应用的哈希函数数量(同样,更多的哈希过滤器减少误报)
(3)布隆过滤器哈希函数的种子
此索引仅适用于String、FixedString和Map类型的数据;它用于LIKE、EQUALS、in、hasToken()和类似的长字符串中单词和其他值的搜索

3、ngrambf_v1

更专业的ngrambf_v1。该索引的功能与tokenbf_v1相同。在Bloom filter设置之前需要一个额外的参数,即要索引的ngram的大小。一个ngram是长度为n的任何字符串,比如如果n是4,A short string会被分割为A sh`` sho, shor, hort, ort s, or st, r str, stri, trin, ring。这个索引对于文本搜索也很有用,特别是没有单词间断的语言

clickhouse跳数索引的最终目的是为了减少对分组的读取;应用ClickHouse数据跳过索引必须避免足够的颗粒读取,以抵消计算索引的成本。如果一个值在每个分组中都只出现一次; 那么任何类型的跳数索引都只会增加额外的开销;通常跳数索引列应与主键有之间有很强的相关性(可以通过表的 order by 添加额外的列);

对索引的添加只能根据各数据的实际结构与分布情况来调整;在添加跳数索引前应优先调整修改主键信息;甚至使用投影或使用实体化视图等技术;即使跳数索引是合适的,也经常需要对索引和表进行仔细的调优。

clickhouse 数据库基础

clickhouse 是列式数据库;每列有单独的数据文件;主键列必须是排序列的前缀
【PRIMARY KEY(C,R,T) ; ORDER BY(C,R,T,Y,U)】;
ORDER BY 可以在主键基础上添加额外排序字段;
ORDER BY中各字段依次 按字典序进行排列;
primary.idx主索引 文件按照 index_granularity 对有序表数据进行分组;并记录主索引中各列最小值;

跳数索引也是在此基础上对列数据进行重新聚合分类检索; 所以主索引与排序字段的选择与排列顺序会直接影响到跳数索引的可用性;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值