clickhouse21.7.11.3 表引擎-MergeTree-主键和稀疏索引

说明

主键默认与 order by 字段相同,可以单独指定,可以重复,不具备唯一性

主键是 稀疏索引,每间隔若 8192 条记录,记录一个主键值

索引常驻内存,采用 稀疏索引,当数据量很大时,大幅减少索引占用的空间。

如:1亿行数据只需要存储12208行索引。因为占用空间小,索引可以常驻内存,查询速度极快

类比

类似核酸检测,每 10 个人分一个管,原本需要做14亿次,缩减做 1.4 亿次

查看索引粒度

cd /program/clickhouse/data/metadata/default

打开 t_student_mt.sql 文件

vim t_student_mt.sql

内容如下:

ATTACH TABLE _ UUID '427416be-ca6e-40b0-8274-16beca6e00b0'
(
    `sid` UInt32,
    `name` String,
    `age` Int32,
    `heigth` UInt32,
    `create_time` DateTime
)
ENGINE = MergeTree
PARTITION BY toYYYYMMDD(create_time)
PRIMARY KEY sid
ORDER BY (sid, age)
SETTINGS index_granularity = 8192

最后一行:SETTINGS index_granularity = 8192,设置索引粒度是 8192,意思是:每间隔 8192 行记录一次主键

索引文件

索引数据保存在 分区目录的 primary.idx 文件中,每个分区都有这个文件

索引的生成过程

这里假设索引粒度(index_grandularity)为3,即每3条数据生成一条索引记录

上面图是一个主键,下面图是两个主键:

/upload/0/0/1IX3OxYeuCVh.png

索引的查询

前后相邻的两个索引的值,构成索引的范围,通过 二分查找 进行查询

例子

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

  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。

感谢:
https://blog.csdn.net/tototuzuoquan/article/details/110789564


原文出处:/show_1IX3OxnyTSXL.html