说明
主键默认与 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条数据生成一条索引记录
上面图是一个主键,下面图是两个主键:

索引的查询
前后相邻的两个索引的值,构成索引的范围,通过 二分查找 进行查询
例子
根据主键的查询条件,确定索引范围
id in ('A02', 'A08'), 转化为索引范围区间 [A01, A04] 和 [A07, A10], 对应索引标记0和2中查询数据。。id = 'A04', 在索引范围[A01, A04]和[A04, A07]区间查询数据,对应索引标记0和1。id > 'A11', 在索引范围[A10, +inf]区间查询数据,对应所有值大于3的索引标记。id like 'A0%', 在索引范围[A01, A04]、[A04,A07]和[A07, A10]区间查询数据,对应索 引标记为0、1和2。
感谢:
https://blog.csdn.net/tototuzuoquan/article/details/110789564

