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

标题: 大数据-138 - ClickHouse 集群 表引擎详解3 - MergeTree 存储结构 数据标记 [打印本页]

作者: 怀念夏天    时间: 2024-9-19 05:26
标题: 大数据-138 - ClickHouse 集群 表引擎详解3 - MergeTree 存储结构 数据标记
点一下关注吧!!!非常感谢!!连续更新!!!

目前已经更新到了:


章节内容

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


MergeTree

续接上节部门

数据存储

ClickHouse 是一个 列式存储 数据库,这意味着每一列的数据是单独存储的,而不是像行式数据库那样将每一行作为一个团体来存储。列式存储的优势在于,它可以针对特定的查询只读取相关的列,大大减少了 I/O 利用,尤其在进行聚合或过滤利用时表现出色。每一列的数据通常会被划分成若干块(block),这些块被构造在存储引擎的元数据和数据文件中。ClickHouse 的存储引擎有多个,常用的包括 MergeTree 引擎及其变种。
表由按主键排序的数据 片断组成。
当数据被插入到表中时,会分成数据片断并按主键的字典序排序。
比方:主键是(CounterID, Date)时,片断中的数据按CounterID排序,具有相同的CounterID的部门按Date排序。
不同的分区的数据会被划分成不同的片断,ClickHouse在背景合并数据片断以便高效的存储,不会合并来自不同分区的数据片断,这个合并机制并不保证相同的主键的全部行都会合并到同一个数据片断中。
ClickHouse会为每个数据片断创建一个索引文件,索引文件包括每个索引行的主键值,索引行号定义为 n * index_granularity。最大的N等于总行数除以index_granularity的值的整数部门。对于每列,跟主键相同的索引行也会写入标记,这些标记可以让你直接找到数据所在的列。
你可以只用单一达标不断的一块块往里加入数据,MergeTree引擎就是为了这样的场景。
按列存储

在MergeTree中数据按列存储,详细到每个字段列,都拥有一个bin数据文件,最终存储数据的文件。
按列存储的好处:

MergeTree往bin里存数据的步骤:

压缩数据块

CompressionMethod_CompressedSize_UnccompressedSize
一个压缩数据块由两部门组成:

头信息固定利用9位字节表示,1个UInt8(1字节) + 2个UInt32(4字节),分别表示压缩算法,压缩后的数据大小,压缩前的数据大小。
如:0x821200065536

可以利用如下的语句,来检察压缩的情况
  1. # 这里路径可能不一样 根据你的来
  2. cd /var/lib/clickhouse/data/default/mt_table/202407_1_1_0
  3. # 查看
  4. clickhouse-compressor --stat data.bin out.log
复制代码
运行截图如下所示:

假如按照默认8192的索引粒度把数据分成批次,每批次读入数据的规则:


数据标记

在 ClickHouse 中,mark 是索引的一部门,用于标记数据文件中数据块的开始位置。标记可以看作是一个辅助数据结构,帮助快速定位必要查询的数据块。在进行查询时,ClickHouse 不会读取整个数据文件,而是根据标记来跳过无关的数据块。
标记通常包罗以下信息:

标记的粒度(即每多少行天生一个标记)可以通过配置 index_granularity 来控制。标记粒度越小,标记文件占用的空间越大,但查询性能也会越好,由于可以更精确地定位到详细的数据块。
.mrk文件:将索引primary.idx和数据文件.bin创建映射关系。
通用 hits_v1 表阐明:



数据标记和区间是对齐的,均按照 index_grangularity粒度隔断,可以通过索引区间的下标编号找到对应的数据标记。
每一个列字段的bin文件都有一个mrk数据标记文件,用于记录数据在bin文件的偏移量信息。
标记数据采用LRU缓存策略加速其取用速度
分区、索引、标记和压缩协同

分区(Partition)

ClickHouse 的分区机制允许将表的数据划分为多个独立的逻辑段,称为分区(partition)。每个分区中的数据可以单独存储和利用,这对处理大规模数据集和加速查询很有帮助。
分区可以基于一个或多个列定义,比方基于日期、哈希值等。创建分区的主要目标是:

索引(Index)

ClickHouse 的索引与传统数据库中的索引有所不同。其主要依赖于主键索引和稀疏索引来加速数据查询。

此外,ClickHouse 还支持 Skip Indexes(跳过索引),用于优化复杂查询时跳过不相关的数据。这些索引范例包括 minmax、set、bloom_filter 等,适用于不同的查询场景。
标记(Marks)

标记(Marks)是 ClickHouse 中的一个重要概念,它是稀疏索引的实现基础。在每列数据的存储文件中,ClickHouse 会定期在某些行记录一个标记,记录下该行在文件中的位置。查询时,ClickHouse 会利用这些标记跳过不必要的块,从而加速查询过程。
压缩协同(Compression)

ClickHouse 的列式存储结构非常适合数据压缩。它通过对每一列的数据进行独立压缩,从而大幅减少存储空间。ClickHouse 提供了多种压缩算法,包括:

写入过程



查询过程



MergeTree的TTL

TTL:time to live 数据存活时间,TTL既可以设置在表上,也可以设置在列上,TTL指定的时间到期后删除相应的表大概列,假如同时设置了TTL,则根据先过期时间删除相应数据。
用法:
TTL time_col + INTERVAL 3 DAY
表示数据存活时间是 time_col 时间的3天后
INTERVAL 可以设定的时间:

TTL 设置列

新建表格:
  1. CREATE TABLE ttl_table_v1 (
  2.   id String,
  3.   create_time DateTime,
  4.   code String TTL create_time + INTERVAL 10 SECOND,
  5.   type UInt8 TTL create_time + INTERVAL 10 SECOND
  6. ) ENGINE = MergeTree
  7. PARTITION BY toYYYYMM(create_time)
  8. ORDER BY id;
复制代码
执行结果如下图所示:

插入数据

  1. INSERT INTO ttl_table_v1 VALUES
  2. ('A0000', now(), 'c1', 1),
  3. ('A0000', now() + INTERVAL 10 MINUTE, 'c1', 1);
复制代码
执行结果如下图所示:

查询结果:
  1. SELECT * FROM ttl_table_v1;
复制代码
执行结果如下图所示:

手动触发数据的合并和压缩:
  1. OPTIMIZE TABLE ttl_table_v1 FINAL;
  2. SELECT * FROM ttl_table_v1;
复制代码
看起来好像没有什么区别…
执行结果如下图:

TTL 设置表

  1. CREATE TABLE tt1_table_v2 (
  2.   id String,
  3.   create_time DateTime,
  4.   code String TTL create_time + INTERVAL 10 SECOND,
  5.   type UInt8
  6. ) ENGINE = MergeTree
  7. PARTITION BY toYYYYMM(create_time)
  8. ORDER BY create_time
  9. TTL create_time + INTERVAL 1 DAY
  10. ;
复制代码
利用 ALTER 编辑表:
  1. ALTER TABLE tt1_table_v1 MODIFY TTL create_time + INTERVAL + 3 DAY;
复制代码
运行截图如下所示:

运行结果如下所示:


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




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