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