clickhouse数据库索引优化与说明(2)

常量体系介绍
文件类型
primary.idx #主索引文件

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

CREATE TABLE hits_UserID_URL
(
    `UserID` UInt32,
    `URL` String,
    `EventTime` DateTime
)
ENGINE = MergeTree
PRIMARY KEY (UserID, URL)
ORDER BY (UserID, URL, EventTime)
SETTINGS index_granularity = 2, index_granularity_bytes = 0;

**注意:**此时index_granularity 等于2

接上文
本问讨论在联合主键情况下;以次索引列(URL)为检索条件的情况下;索引的有效利用率;

过滤条件:

WHERE URL = w3

现在hits_UserID_URL表中存在如下数据
在这里插入图片描述
当userID值为同一值的情况下 :
分组mark0的URL值小于w3的情况下;且下一个分组(mark1)的URL 值也小于w3;则可以确定mark0这个分组中不存在URL = w3的情况(回顾:primary.idx 各分组下;各字段依次做有序排列)

分组mark1的URL值小于w3时;且下一个分组(mark2)的URL大于、等于w3; 这时无法确认mark1 分组中是否存在w3;则需要遍历分组mark1;

由于分组mark2 、mark3 的URL大于W3;则可以排除该分组;
通过以上过程分析可以得到:当对联合主键中 非第一个主键进行过滤时; 该主键前一组件重复度较高时;排除搜索算法能取得较好的性能;

当hits_UserID_URL表中存在如下数据
在这里插入图片描述

当userID的值不再有较高重复度时; 根据排除搜索算法 将会选中所有分组(尽管只有mark2中存在w3);

总结:
primary.idx 中各分组是有序的(以联合索引中第一列);
分组中各字段依次以字典序列进行排序;
clickhouse 对联合索引的第一列过滤时;会采用二分查找法;对联合索引中非第一列过滤是采用排除搜索算法
在创建联合索引的时候;将 重复度高的列 放在前边;可取得较好的检索性能;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值