https://blog.csdn.net/weixin_42687074/article/details/112623806
特点有哪些?
-
场景
读多改少吞吐高,宽表少列字段短,不必事务一致低
查询相对较少(通常每台服务器每秒查询数百次或更少)
- 每个查询有一个大表。除了他以外,其他的都很小。(Join弱?)
查询结果明显小于源数据。换句话说,数据经过过滤或聚合,因此结果适合于单个服务器的RAM中
特性
Local attached storage
- 原生支持 shard + replication
- SQL 直接接口,有比较丰富的原生 client
- 快
- 数据剪枝(LSM)
- 资源垂直整合能力(并发 MPP+ SMP )
roaring bitmap
列式、专用压缩(LZ4/ZSTD)、向量(SIMD)、磁盘、并行、分布式、SQL、写入无锁、稀疏索引、在线查询、近似计算、自适应JOIN、数据安全、角色控制、强类型、可复制(用zookeeper维护)
优化了吞吐而不是延迟,每秒几十亿扫描
缺点:没有完整事务支持、缺少高频率,低延迟的修改或删除已存在数据的能力,稀疏索引不适合通过其键检索单行的点查询
引擎
- 数据库引擎
- 表引擎
- MergeTree:按主键排序、分区键
- VersionedCollapsingMergeTree(Sign,Version):根据版本折叠
- AggregatingMergeTree:删主键同(准确的说是排序键)的行替换成一行,做增量数据的聚合统计
- CollapsingMergeTree(Sign):折叠
- ReplacingMergeTree:删排序键值同(ver版本列)
- SummingMergeTree:具有相同主键的行合并为一行
- ReplicatedXXXMergeTree:副本表级别
- 日志引擎
- Log
- StripeLog
- TinyLog
-
存储
按主键字典序排序的数据片段(DATA PART)组,Wide/Compact,最小可移动的单元
- 颗粒(granules):ClickHouse中进行数据查询时的最小不可分割数据集(可能包含多行)
-
索引
索引:标记和标记号,额外数据读取,不要求主键唯一
- 主键:改善索引性能略过很多、改善数据压缩(一致性越好压缩率越高)、长的主键会对插入性能和内存消耗有负面影响/不影响select
- 稀疏索引是因为希望索引在内存中小,维护数更多,导致了主键不唯一
- SummingMergeTree和AggregatingMergeTree:只保留少量的列在主键当中用于提升扫描效率,将维度列添加到排序键中
- 跳数索引
- primary.idx:index_granularity=8192,每个第N行的主键值,在内存中
column.mrk:每个第N行在数据文件中的偏移量,被缓存
SQL语句
建表
- ENGINE = MergeTree()
- ORDER BY XXX 排序键,ORDER BY tuple() 语法创建没有主键的表->数据插入的顺序存储
- 自定义分区键:PARTITION BY toYYYYMM(VisitDate)【少于1000】
- PRIMARY KEY 选择与排序键不同的主键
- SAMPLE BY 抽样
- TTL date + INTERVAl 1 DAY
- SETTINGS
依据主键索引剪掉不符合的数据,依据按月分区的分区键剪掉那些不包含符合数据的分区
