Clickhouse知识图谱
2023-09-05 17:35:13 0 举报
AI智能生成
一图纵览clickhose,开发使用时可以直接搜索关键字,跳转到对应知识节点,后续会持续更新,一杯奶茶,赚了
作者其他创作
大纲/内容
数据定义
3种数据类型
基础类型
数值
整数 Int8/16/32/64
浮点数 Float32/64
定点数 Decimal32/64/128(S)
加减法时,S取最大值
乘法时,S取和
除法时,S取被除数
字符串
String
长度不限,不需要声明大小
FixedString(N)
使用null字节填充末尾字符
UUID
- 共有32位,格式为8-4-4-4-12
- 如果没有赋值,会按照格式用0填充
时间
DateTime
精确到秒
DateTime64
精确到亚秒
Date
精确到天
复合类型
数组 Array
常规定义 array(T)
简写定义 [T]
元组 Tuple
常规定义 tuple(T)
简写定义 (T)
枚举 Enum
Enum8/16 对应 (String:Int8/16)
嵌套 Nested
特殊类型
Nullable
Nullable(基础类型)
Domain
IPv4 基于UInt32 封装
IPv6 基于FixedString(16) 封装
5种数据库引擎
Ordinary - 默认引擎
可使用任意表引擎
Dictionary - 字典引擎
自动为所有数据字典创建对应的数据表
Memory - 内存引擎
数据存在内存中,不涉及磁盘操作,服务重启后数据被清除
Lazy - 日志引擎
只能使用Log系列表引擎
MySQL - MySQL引擎
自动同步远端MySql中数据,并创建对应的MySql引擎数据表
3种创建表方式
常规定义
复制其它表结构
- 支持在不同的数据库之间复制表结构
- ENGINE表引擎可以与原表不同
SELECT子句创建
select子句的查询结果会写入创建的数据表中
3种设置字段默认值方式
DEFAULT
MATERIALIZED
ALIAS
临时表
- 通过TEMPORARY 关键字创建,不用指定数据库和表引擎参数
- 会话级生命周期,默认Memory 表引擎
- 表同名时,临时表的优先级大于普通表
分区表
数据分区(partition)&数据分片(shard)
数据分区的基本操作
查询
删除
复制
满足以下条件,支持将A表分区数据复制到B表
- 两张表需要有相同的分区键值
- 两张表结构完全相同
重置
卸载&装载
备份&还原(待补充)
数据删除&修改
- 属于Mutation操作,适用于批量数据的修改和删除
- 不支持事务,无法回滚操作
- 后台异步执行,执行进度可以查询system.mutations 系统表
数据字典
内置
扩展
扩展字典的配置文件由config.xml 文件中的dictionaries_config 配置项指定
clickhouse会自动识别并加载/etc/clickhouse-server目录下所有以_dictionary.xml结尾的配置文件,并支持不停机在线更新配置文件
DDL定义
表引擎分类
合并树
合并树表引擎家族(组合关系)
MergeTree - 基础表引擎
创建方式
PARTITION BY - 分区键
ORDER BY - 排序键
PRIMARY KEY - 主键
SAMPLE BY - 抽样表达式
SETTINGS
index_granularity - 索引粒度
index_granularity_bytes
enable_mixed_granularity_parts - 是否开启自适应索引间隔(默认开启)
merge_with_ttl_timeout - TTL功能
storage_policy - 存储策略
在磁盘上的物理存储结构
partition - 分区目录
checksums.txt- 校验文件
columns.txt - 列信息文件
count.txt - 计数文件
primary.idx - 一级索引文件
[Column].bin - 数据文件
[Column].mrk - 列字段标记文件
[Column].mrk2 - 列字段标记文件(使用了自适应大小的索引间隔)
partition.dat
minmax_[Column].idx
skp_idx_[Column].idx
skp_idx_[Column].mrk
数据分区
分区ID规则
不指定分区键
分区ID默认为all,所有数据写入all分区
使用整型
优先转换成日期类型YYYYMMDD格式,转换不了则直接将整形字符作为分区ID
使用日期类型
按照YYYYMMDD格式化后的字符作为分区ID
使用其他类型
通过128位Hash算法取值作为分区ID
分区目录命名规范
PartitionID_MinBlockNum_MaxBlockNum_Level
PartitionID - 分区ID
MinBlockNum和MaxBlockNum - 最小数据块编号与最大数据块编号
Level - 合并的层级(次数)
分区目录的合并过程
新目录名称的合并规则
- MinBlockNum:取同一分区内所有目录中最小的MinBlockNum值
- MaxBlockNum:取同一分区内所有目录中最大的MaxBlockNum值
- Level:取同一分区内最大Level值并加1
索引
稀疏索引&稠密索引
索引粒度
MarkRange
索引查询过程
生成查询区间
递归交集判断
不存在交集
用剪枝(Pruning)算法对这段MarkRange进行优化
存在交集
MarkRange步长(end - start)> 8
将此区间拆分成8个子区间,并重复进行递归交集判断
MarkRange步长(end - start)<= 8
记录MarkRange并返回
合并MarkRange区间
将最终匹配的MarkRange聚在一起,合并它们的范围
二级索引-新版本中取消
数据存储(压缩数据块)
各列独立存储
优点:
1、可以更好地进行数据压缩
2、能够最小化数据扫描的范围
1、可以更好地进行数据压缩
2、能够最小化数据扫描的范围
数据写入.bin文件的步骤:
1、通过压缩算法(默认LZ4算法)进行数据压缩
2、按照order by 的声明排序
3、以压缩数据块形式组织后写入.bin文件
1、通过压缩算法(默认LZ4算法)进行数据压缩
2、按照order by 的声明排序
3、以压缩数据块形式组织后写入.bin文件
压缩数据块
压缩数据块示意图
切割压缩数据块的逻辑示意图
.bin 文件中引入压碎数据块的目的
数据标记
数据标记和索引的关系
数据标记和索引区间一一对应
数据标记文件和.bin文件一一对应
数据标记文件.mrk
一行标记数据使用一个元组表示,元组内包含两个整型数值的偏移量信息,
分别表示
1、在此段数据区间内,在对应的.bin压缩文件中,压缩数据块的起始偏移量
2、将该数据压缩块解压后,其未压缩数据的起始偏移量
分别表示
1、在此段数据区间内,在对应的.bin压缩文件中,压缩数据块的起始偏移量
2、将该数据压缩块解压后,其未压缩数据的起始偏移量
标记数据与一级索引数据不同,它并不能常驻内存,而是使用LRU(最近最少使用)缓存策略加快其取用速度
工作方式
数据TTL(Time To Live)
- 支持表、字段粒度设置,如果同时设置了表、字段的TTL,以先到期的那个为主
- 需要通过对某个DateTime或Date类型字段进行INTERVAL操作来表述TTL的过期时间
- 主键字段不能被声明TTL
- 默认合并频率由merge_with_ttl_timeout参数控制,默认86400秒(1天),设置过小可能有性能损耗
- 可执行optimize命令强制触发TTL清理:optimize TABLE xxx FINAL
- 定义后不能取消,但能通过命令控制全局(所有表、字段)TTL合并任务的启停:SYSTEM STOP/START TTL MERGES
语法定义
列级别TTL
建表声明
修改声明
表级别TTL
建表声明
修改声明
运行机理
写入数据后,每个分区目录下都会生成ttl.txt文件,
通过JSON配置保存信息
通过JSON配置保存信息
- columns用于保存列级别TTL信息
- table用于保存表级别TTL信息
- min/max保存当前数据分区内,TTL指定日期字段的最小值/最大值分别与INTERVAL表达式计算后的时间戳
在MergeTree合并分区时,才出发删除TTL过期数据的逻辑
基于贪婪算法删除分区,尽可能找合并次数更多,MaxBlockNum更大的分区(最旧的)
如果一个分区内某一列数据TLL到期后被全部删除了,那么在合并分区后的新目录中,将不会有对应列数据的文件(.bin和.mrk)
多路径存储策略
3类存储策略
默认策略
JBOD策略
HOT/COLD策略
ReplacingMergeTree - 分区内主键重复合并
创建方式
ENGINE - 表引擎声明
ORDER BY - 判断数据是否重复的依据
Tips
- 使用ORDER BY 排序键作为判断重复数据的唯一键
- 在合并分区时触发删除重复数据的动作,可执行optimize强制分区合并
- 同一分区内删除重复数据,不同分区间的重复数据不会被删除
- 因为分区内数据已经按ORDER BY指定顺序排序了,所以能较快的找到相邻的重复数据并删除
- 2种去重策略:1-如果设置了ver版本号,则保留ver字段最大的一行;2-如果没有设置ver版本号,则保留最后写入的一行
SummingMergeTree - 分区内汇总数据
PRIMARY KEY 必须是 ORDER BY 的前缀
创建方式
ENGINE - 表引擎声明
ORDER BY - 定义SUM汇总Key
Tips
- 用ORBER BY排序键作为汇总数据的条件Key
- 在合并分区时触发汇总操作,可执行optimize强制分区合并
- 同一分区内汇总Key相同的数据,不同分区间Key相同的数据不会进行汇总
- 因为分区内数据已经按ORDER BY指定顺序排序了,所以能较快的找到相邻且有相同Key的数据进行汇总
- 同一分区内,相同Key的多行数据合并成一行,其中,汇总字段进行SUM计算,非汇总字段使用第一行数据的取值
支持嵌套类型的字段
- 需要被SUM汇总的字段名称必须以Map后缀结尾
- 默认以嵌套类型中第一个字段作为聚合条件Key
- 除第一个字段外,任何名称以Key、Id或Type为后缀结尾的字段,都将和第一个字段组成复合Key
AggregatingMergeTree - 分区内聚合数据
创建方式
ENGINE - 表引擎声明
ORDER BY - 定义聚合Key
AggregateFunction数据类型
特殊的数据类型,能以二进制形式存储中间状态结果
写入数据时 ,要调用*State函数
(*表示定义时使用的聚合函数)
(*表示定义时使用的聚合函数)
查询数据时,要调用*Merge函数
(*表示定义时使用的聚合函数)
(*表示定义时使用的聚合函数)
Tips
- 用ORBER BY排序键作为聚合数据的条件Key
- 用AggregateFunction字段类型定义聚合函数的类型以及聚合的字段
- 在合并分区时触发聚合计算,可执行optimize强制分区合并
- 同一分区内对Key相同的数据进行聚合计算,不同分区间Key相同的数据不会进行聚合计算
- 因为分区内数据已经按ORDER BY指定顺序排序了,所以能较快的找到相邻且有相同Key的数据进行聚合计算
- 同一分区内,相同Key的多行数据合并成一行,非主键、非AggregateFunction类型字段使用第一行数据的取值
一般结合物化视图使用
CollapsingMergeTree - 分区内按写入顺序折叠数据
创建方式
ENGINE - 表引擎声明
ORDER BY - 定义折叠的Key
AggregateFunction数据类型
特殊的数据类型,能以二进制形式存储中间状态结果
写入数据时 ,要调用*State函数
(*表示定义时使用的聚合函数)
(*表示定义时使用的聚合函数)
查询数据时,要调用*Merge函数
(*表示定义时使用的聚合函数)
(*表示定义时使用的聚合函数)
基于sign修改、删除数据示意图
- 如果sign=1比sign=-1的数据多一行,则保留最后一行sign=1的数据
- 如果sign=-1比sign=1的数据多一行,则保留第一行sign=-1的数据
- 如果sign=1和sign=-1的数据行一样多,并且最后一行是sign=1,则保留第一行sign=-1和最后一行sign=1的数据
- 如果sign=1和sign=-1的数据行一样多,并且最后一行是sign=-1,则什么也不保留
- 其余情况,ClickHouse会打印警告日志,但不会报错,在这种情形下,查询结果不可预知
Tips
在分区合并时才进行数据折叠,可用having sum(sign) > 0 查询折叠后的数据
虽然是针对分区内的规则,但一般修改、删除行级数据,分区字段值是不变的
必须按正常顺序写入,先写sign = 1,再写sign = -1 的数据,才能正常折叠
VersionedCollapsingMergeTree - 分区内按版本号折叠数据
创建方式
ENGINE - 表引擎声明
ORDER BY - 定义折叠的Key
删除、修改示例
删除
修改
ReplicatedMergeTree - 支持数据副本
外部存储
内存
文件
接口
其他
数据查询
WITH 子句
定义变量
调用函数
定义子查询
嵌套使用
FROM 子句
可从虚拟表(system.one)取数
可使用Final 修饰符(会降低查询性能,尽量避免使用)
SAMPLE 子句
只能用于MergeTree系列引擎的表
在创建表时要声明SAMPLE BY 抽样表达式
SAMPLE BY 声明的表达式必须在主键声明内
Sample Key 必须是Int 类型,若不是,创建表时不会报错,查询数据时报错
3种采样方式
SAMPLE factor - 按因子系数采样
SAMPLE rows - 按样本数量采样
SAMPLE factor OFFSET n - 按因子系数和偏移量采样
SELECT CounterID FROM hits_v1 SAMPLE 0.4 OFFSET 0.5;
上述代码最终的查询会从数据的二分之一处开始,按0.4的系数采样数据
上述代码最终的查询会从数据的二分之一处开始,按0.4的系数采样数据
ARRAY JOIN 子句
INNER ARRAY JOIN
LEFT ARRAY JOIN
0 条评论
下一页