不太理解主键和索引在查询时,区间的选择范围
发布于 1 个月前 作者 michael-ancestor 222 次浏览 来自 问答

大家好,在看文档的时候,对于【主键和索引】在查询时“区间范围的”说明,不是太理解:

主键和索引在查询中的表现¶

我们以 (CounterID, Date) 以主键。排序好的索引的图示会是下面这样:

全部数据 : [-------------------------------------------------------------------------] CounterID: [aaaaaaaaaaaaaaaaaabbbbcdeeeeeeeeeeeeefgggggggghhhhhhhhhiiiiiiiiikllllllll] Date: [1111111222222233331233211111222222333211111112122222223111112223311122333] 标记: | | | | | | | | | | | a,1 a,2 a,3 b,3 e,2 e,3 g,1 h,2 i,1 i,3 l,3 标记号: 0 1 2 3 4 5 6 7 8 9 10

如果指定查询如下:

CounterID in ('a', 'h'),服务器会读取标记号在 [0, 3) 和 [6, 8) 区间中的数据。
CounterID IN ('a', 'h') AND Date = 3,服务器会读取标记号在 [1, 3) 和 [7, 8) 区间中的数据。
**(上面这句不理解:为什么不从[0,3)或者是[2,3)开始读取数据?而CounterID in('a','h')却是从[0,3)开始?)**
Date = 3,服务器会读取标记号在 [1, 10] 区间中的数据。
3 回复

标记x表示该块中数据范围是从x开始,到下一个标记的起始x 以上为例 0 1 2 a,1 a,2 a,3 0块中是否包含Date = 3? 0块中Date从1开始,到2,下一块的起始是2。显然不包含3,因为3大于了2,3只能出现在1块,或2块中。

看CounterID in (‘a’, ‘h’)? 0,1,2块中都可能有a。3块中有没有a?没有,因为3块是从b开始的。

@bill_zhou 感谢回复。范围查询这个意思我理解。没有太明白的地方是:CounterID IN (‘a’, ‘h’) AND Date = 3,服务器会读取标记号在 [1, 3) 和 [7, 8) 区间中的数据。按官方的【图示】,Date=3 & counterId in(‘a’,‘h’)的位置,我理解应该是: [2,3)和[7,8)(既满足date=3,同时也满足counterId的位置开始觉得应该是2)。可能是图本身的位置不是那么精确吧~;-) clickhouse_主键和索引的问题.jpg

@michael-ancestor

官方的是对的。还是看我上面对范围的解释。

1的日期范围是2到3,所以1可能包含3,需要进行扫描。

回到顶部