当前位置: 首页>前端>正文

拿到索引的下标 索引怎么标记

1.MergeTree的稀疏索引

数据按照主键排序后存储的
每个索引记录对应8192条记录(有index_grandularity指定),索引是常驻内存的。
索引是常驻内存的。

拿到索引的下标 索引怎么标记,拿到索引的下标 索引怎么标记_数据块,第1张

2.索引的生成过程

索引由Primary Key指定。索引数据保存在primary.idx文件中。
这里假设索引粒度(index_grandularity)为3,即每3条数据生成一条索引记录。

拿到索引的下标 索引怎么标记,拿到索引的下标 索引怎么标记_主键_02,第2张

3.索引的查询

拿到索引的下标 索引怎么标记,拿到索引的下标 索引怎么标记_拿到索引的下标_03,第3张

前后相邻的两个索引的值,构成索引的范围。

根据主键的查询条件,确定索引范围。

  1. id in (‘A02’, ‘A08’), 转化为索引范围区间[A01, A04] 和 [A07, A10], 对应索引标记0和2中查询数据。。
  2. id = ‘A04’, 在索引范围[A01, A04]和[A04, A07]区间查询数据,对应索引标记0和1。
  3. id > ‘A11’, 在索引范围[A10, +inf]区间查询数据,对应所有值大于3的索引标记。
  4. id like ‘A0%’, 在索引范围[A01, A04]、[A04,A07]和[A07, A10]区间查询数据,对应索 引标记为0、1和2。

4.数据标记的工作机制

4.1 数据存储

bin文件是真正存储数据的文件。
bin文件的数据是按照排序健排序后存储的。
一个bin文件由N个压缩数据块组成。
一个压缩数据块存储压缩前大小为64K~1M字节的数据。

拿到索引的下标 索引怎么标记,拿到索引的下标 索引怎么标记_主键_04,第4张

拿到索引的下标 索引怎么标记,拿到索引的下标 索引怎么标记_主键_05,第5张

4.2数据标记

mkt文件是存储数据标记的文件。
存储索引标记、压缩数据块在BIN文件的偏移量、解压缩数据块的偏移量。

假设age字段,每个值占用1字节空间,在该列则一个索引粒度范围内占用8192 * 1 字节 = 8192字节 = 8KB。

每8(64KB/8KB = 8)个索引粒度,占用一个压缩数据块。

压缩数据块的切分规则:

  • 一个压缩数据块存储压缩前大小为64K~1M 字节的数据
  • 按一个索引粒度为最小单位, 添加其对应的数据,用于生 成压缩数据块。
  • 如果一个索引粒度对应的数据小于64K,则继续添加下一个索引粒度对应的数据,直至数据的大小在64K~1M之间,然后生成压缩数据块。
  • 如果一个索引粒度对应的数据超过1M,则该批次数据将拆分为多个压缩数据块存储。

拿到索引的下标 索引怎么标记,拿到索引的下标 索引怎么标记_主键_06,第6张

4.3数据查询

1.确定分区(如果有)
2.根据primary.idx确定数据在哪些索引标记内。
3.根据索引标记和数据标记文件(.mrk或.mrk2)确定数据在哪个压缩数据块,以及在解压缩数据块中的偏移量。
4.加载数据至内存,向量化操作、过滤查询。

拿到索引的下标 索引怎么标记,拿到索引的下标 索引怎么标记_数据_07,第7张

4.4 数据查询示例

拿到索引的下标 索引怎么标记,拿到索引的下标 索引怎么标记_数据_08,第8张

示例1:主键查询
Where id = ‘A02’
1、使用idx索引文件定位到索引标记为0.
2、使用mrk文件,定位数据。
3、将数据加载至内存。

示例2:主键+非主键查询
where id=’A04’ and age = 20
1.使用idx索引定位到索引标记为0、1。
2.使用age字段的mrk文件,定位 到压缩数据块和数据在解压缩数 据块中的偏移量。
3.将数据加载至内存并过滤数据。

示例3:非主键查询
where age = 20
1.由于没有指定id,将定位到所有的索引标记。
2.使用age字段的mrk文件,扫描所有的压缩数据块和数据在解压缩数据块中的偏移量。这一步相当于全表扫描。
3.将数据加载至内存并过滤数据。


https://www.xamrdz.com/web/2yq1942442.html

相关文章: