ToB企服应用市场:ToB评测及商务社交产业平台

标题: 大数据-137 - ClickHouse 集群 表引擎详解2 - MergeTree 存储结构 一级索引 [打印本页]

作者: tsx81429    时间: 2024-10-1 05:05
标题: 大数据-137 - ClickHouse 集群 表引擎详解2 - MergeTree 存储结构 一级索引
点一下关注吧!!!非常感谢!!连续更新!!!

现在已经更新到了:


章节内容

上节我们完成了如下的内容:

MergeTree

ClickHouse中最强盛的表引擎当属 MergeTree(归并树)引擎及该系列(*MergeTree)中的其他引擎。
MergeTree 引擎系列的基本理念如下,当你有巨量数据要插入到表中,你要高效的一批批写入数据片段,并希望这些数据片段在后台按照一定规则归并,相比在插入时不断修改(重写)数据进存储,这种策略会高效很多。
存储结构

创建新表

  1. CREATE TABLE mt_table(date Date, id UInt8, name String)
  2. ENGINE = MergeTree PARTITION BY toYYYYMM(date) ORDER BY id;
  3. CREATE TABLE mt_table3 (
  4.   `date` Date,
  5.   `id` UInt8,
  6.   `name` String
  7. ) ENGINE = MergeTree PARTITION BY toYYYYMM(date) ORDER BY id;
复制代码
实行的结果如下图所示:

插入数据

  1. INSERT INTO mt_table VALUES ('2024-07-31', 1, 'wzk');
  2. INSERT INTO mt_table VALUES ('2024-07-30', 2, 'icu');
  3. INSERT INTO mt_table VALUES ('2024-07-29', 3, 'wzkicu');
复制代码
实行结果如下图所示:

检察目录

  1. cd /var/lib/clickhouse/data/default/mt_table
  2. ls
复制代码
实行结果如下图所示:

我们任意进入一个目录,可以看到:

存储结构

  1. .
  2. ├── 202407_1_1_0
  3. │   ├── checksums.txt
  4. │   ├── columns.txt
  5. │   ├── count.txt
  6. │   ├── data.bin
  7. │   ├── data.mrk3
  8. │   ├── default_compression_codec.txt
  9. │   ├── minmax_date.idx
  10. │   ├── partition.dat
  11. │   └── primary.idx
  12. ├── 202407_2_2_0
  13. │   ├── checksums.txt
  14. │   ├── columns.txt
  15. │   ├── count.txt
  16. │   ├── data.bin
  17. │   ├── data.mrk3
  18. │   ├── default_compression_codec.txt
  19. │   ├── minmax_date.idx
  20. │   ├── partition.dat
  21. │   └── primary.idx
  22. ├── 202407_3_3_0
  23. │   ├── checksums.txt
  24. │   ├── columns.txt
  25. │   ├── count.txt
  26. │   ├── data.bin
  27. │   ├── data.mrk3
  28. │   ├── default_compression_codec.txt
  29. │   ├── minmax_date.idx
  30. │   ├── partition.dat
  31. │   └── primary.idx
  32. ├── detached
  33. └── format_version.txt
复制代码
实行结果如下图所示:


数据分区

数据是以分区目录的情势构造的,每个分区独立分开存储。这种情势,在数据查询的时候,可以有效的跳过无用的数据文件。
分区规则

分区键的取值,生成分区ID,分区根据ID决定,根据分区键的数据范例不同,分区ID的生成现在有四种规则:

分区目录生成


分区目录归并

MergeTree 的分区目录在数据写入过程中被创建,不同的批次写入数据属于同一分区,也会生成不同的目录,在之后某个时刻再归并(写入后10-15分钟),归并后的旧分区目录默认8分钟后删除。
同一个分区的多个目录归并以后得命名规则:

一级索引

稀疏索引

文件:primary.idx
MergeTree的主键使用PrimaryKey定义,主键定义之后,MergeTree会根据index_granularity间隔(默认8192)为数据生成一级索引并生存至primary.idx中,这种方式就是稀疏索引。
简化情势:通过 ORDER BY 指代 主键
primary.idx 文件的一级索引接纳稀疏索引。


稀疏索引占用空间小,以是primary.idx内的索引数据常驻内存,取用速度快。
生成规则

primary.idx文件,由于稀疏索引,以是MergeTree要间隔index_granularity行数据才会生成一个索引记录,其他索引值会根据声明的主键字段获取。
查询过程

索引是怎样工作的?对primary.idx文件的查询过程

小案例:

共200行数据/5 = 40个MarkRange

假设索引查询 where Id = 3

在ClickHouse中,MergeTree引擎表的索引列在建表使用ORDER BY语法来指定。
而在官方中,用了下面一副图来说明。

这张图示出了以 CounterID、Date两列为索引列的情况,即先以CounterID为主要关键字排序,再以Date为次要关键字排序,最后用两列的组合作为索引键。Marks与MarkNumbers就是索引标记,且Marks之间的间隔就由建表时的索引粒度参数index_granularity来制定,默认是8192。
在 ClickHouse 之父Alexey Milovidov分享的PPT中,有更加详细的图示:

如许,每一列都通过ORDER BY列进行了索引,查询时,先查找到数据地点的parts,再通过mrk2文件确定bin文件中数据的范围即可。
不过,ClickHouse的稀疏索引与Kafka的稀疏索引不同,可以由用户自由组合多列,因此也要格外注意不要参加太多索引列,防止索引数据过于稀疏,增大存储和查找成本。另外,基数太小(即区分度太低)的列不得当做索引列,因为很有可能横跨多个mark值仍然雷同,没有索引的意义了。
跳数索引


可用范例



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4