常量体系介绍
文件类型:
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 对联合索引的第一列过滤时;会采用二分查找法;对联合索引中非第一列过滤是采用排除搜索算法;
在创建联合索引的时候;将 重复度高的列 放在前边;可取得较好的检索性能;