clickhouse(引擎)

数据库引擎(让我想到了InooDB和MyISAM)

(1)MySQL
①支持远程mysql的表映射到clickHouse
②允许insert和select
③不可以rename alert create等
④https://clickhouse.com/docs/zh/engines/database-engines/mysql/
(2)Lazy
①在最后一次访问之后,只在RAM中保存expiration_time_in_seconds秒。只能用于*Log表。
②它是为存储许多小的*Log表而优化的,对于这些表,访问之间有很长的时间间隔。
(3)Atomic
(4)SQLite
①允许远程连接SQLite的服务。
②支持读写操作,以及交换数据
(5)PostgreSQL
①允许连接到远程PostgreSQL服务。
②支持读写操作(SELECT和INSERT查询),以在ClickHouse和PostgreSQL之间交换数据。

 这段没啥可说的,一般用到了再补吧。个人认为最重要的还是表引擎这一块儿涉及到最核心的合并树。

表引擎(表的类型)

(1)概述 表的类型决定了以下情况
①数据的存储方式和位置,写到哪里以及从哪里读取数据
②支持哪些查询 如何支持
③并发数据访问
④索引的使用
⑤是否可以多线程
⑥数据复制参数
以下为引擎类型
(2)合并树家族(MergeTree)
①适用于高负载任务(快速插入数据并进行后续的后台数据处理)
②最为通用,引擎老大
③支持数据复制,分区,其他(别人不支持的 他可以做到)
④成员:
1)MergeTree
2)ReplaingMergeTree
3)SummingMergeTree
4)AggregatingMergeTree(聚合)
5)CollapsingMergeTree(折叠)
6)VersionedCollapsingMergeTree(版本折叠)
7)GraphiteMergeTree(深灰、灰度?)
(3)日志系列
①最小功能的轻量级引擎
②适用于快速写入多个小表(最多约100万行)并在以后整体读取
③成员:
1)TinyLog(极小的)
2)StripeLog(条)
3)Log
(4)集成引擎
①与其他数据库或处理系统集成的引擎
②成员:
1)Kafka(重点关照)
2)MySQL(重点关照)
3)ODBC
4)Jdbc(重点关照)
5)HDFS
(5)特别
①用于其他特定功能
②成员:	
1)待续
(6)虚拟列
①表引擎的一部分,定义于源代码
②只读,不可create table,在SHOW CREATE TABLE 和 DESCRIBE TABLE 的查询结果中不会出现
③查询时 需在select中注明虚拟列,select*不会返回
④字段与虚拟列冲突(重名),虚拟列不在被访问,建议以—_设置

 


合并树家族

MergeTree 最强

①用于插入极大量的数据到一张表中,数据可以以数据片段的形式一个接着一个的快速写入,
数据片段在后台按照一定的规则进行合并。
相比在插入时不断修改(重写)已存储的数据,这种策略会高效很多。
②特点
1)按主键排序
2)可以指定分区键
3)支持数据副本
4)支持数据采样
③Order by 与primary key 基本上都是定义相同的字段,
只有在SummingMergeTree与AggregatingMergeTree时才会出现区别,
他俩都是根据order by来的,主键与聚合的条件定义分离,为修改聚合条件留下空间。

ReplacingMergeTree(置换合并)重点为去重

 

①与mergeTree的create时 engine不同 (ENGINE = ReplacingMergeTree(ver))
 ver是个彩蛋
②optimize TABLE replace_table FINAL (这句命令要求强制合并分区)
③使用ORBER BY排序键作为判断重复数据的唯一键。
④只有在合并分区的时候才会触发删除重复数据的逻辑。
⑤以数据分区为单位删除重复数据。当分区合并时,
同一分区内的重复数据会被删除;不同分区之间的重复数据不会被删除。
⑥在进行数据去重时,因为分区内的数据已经基于ORBER BY进行了排序,
所以能够找到那些相邻的重复数据。
⑦数据去重策略有两种:
1)如果没有设置ver版本号,则保留同一组重复数据中的最后一行。
2)如果设置了ver版本号,则保留同一组重复数据中ver字段取值最大的那一行。

SummingMergeTree(汇总)

①比较关心数据的汇总(ENGINE = SummingMergeTree((col1,col2,…)))
②需要 A B C D四个总段汇总,但业务上只需要A为主键时可以order by ABCD primary key A
③可以通过DDL 修改排序列ALter
④用ORBER BY排序键作为聚合数据的条件Key。
⑤只有在合并分区的时候才会触发汇总的逻辑。
⑥以数据分区为单位来聚合数据。当分区合并时,
同一数据分区内聚合Key相同的数据会被合并汇总,而不同分区之间的数据则不会被汇总。
⑦如果在定义引擎时指定了columns汇总列(非主键的数值类型字段),
则SUM汇总这些列字段;如果未指定,则聚合所有非主键的数值类型字段。
⑧在进行数据汇总时,因为分区内的数据已经基于ORBER BY排序,
所以能够找到相邻且拥有相同聚合Key的数据。
⑨在汇总数据时,同一分区内,相同聚合Key的多行数据会合并成一行。
其中,汇总字段会进行SUM计算;对于那些非汇总字段,则会使用第一行数据的取值。
⑩支持嵌套结构,但列字段名称必须以Map后缀结尾。嵌套类型中,
默认以第一个字段作为聚合Key。除第一个字段以外,任何名称以Key、
Id或Type为后缀结尾的字段,都将和第一个字段一起组成复合Key。

 

AggregatingMergeTree (聚集)summing的升级款

①与SummingMergeTree一样也是通过Order by的条件进行聚合 
②一般都是先建一个MergeTree的表,
之后在创建一个AggregatingMergeTree 二者关联进行互动
③使用AggregateFunction字段类型定义聚合函数的类型以及聚合的字段。
④只有合并分区时触发
⑤依旧是以分区为单位,不同分区数据不会被聚合;
分区合并时,满足排序键条件的数据合并计算
⑥计算时,因为分区内的数据已经基于ORBER BY排序,
所以能够找到那些相邻且拥有相同聚合Key的数据。
⑦在聚合数据时,同一分区内,相同聚合Key的多行数据会合并成一行。
对于那些非主键、非AggregateFunction类型字段,则会使用第一行数据的取值。
⑧AggregateFunction类型的字段使用二进制存储,在写入数据时,
需要调用*State函数;而在查询数据时,则需要调用相应的*Merge函数。
其中,*表示定义时使用的聚合函数。
⑨AggregatingMergeTree通常作为物化视图的表引擎,与普通MergeTree搭配使用。

 CollapsingMergeTree (折叠合并数) 以增代删

①语法create之后 (ENGINE = CollapsingMergeTree(sign))
②不是实时触发,也只有在分区合并的时候才会体现。
所以在分区合并之前,用户还是会看到旧的数据。解决这个问题的方式有两种。
1)查数据前,使用optimize TABLE table_name FINAL命令强制分区合并,
效率极低,生产环境慎用。
2)改变查询方式
③只有相同分区内的数据才有可能被折叠。
不过这项限制对于CollapsingMergeTree来说通常不是问题,
因为修改或者删除数据的时候,这些数据的分区规则通常都是一致的,并不会改变。
④对写入顺序有要求,如果是INSERT sign =1之后 sign=-1,这样的可以折叠;
如果先INSERT sign=-1 之后sign=1,则不能折叠
⑤比较支持单线程处理,多线程时不太给力,需要VersionedCollapsingMergeTree助阵

 VersionedCollapsingMergeTree

①作用于小老弟儿CollapsingMergeTree完全相同,区别在于不要求任何的写入顺序
②除了需要指定一个sign之外,还需要指定一个ver(版本号)
③语法(ENGINE = VersionedCollapsingMergeTree(sign,ver))
④对于多线程操作很给力

 


内存类型(表引擎)mysql也有

(1)只在内存中昙花一现,其实就是弱化版的Redis
(2)Memory(mysql也有这个引擎 于text/blob必死)
①ENGINE = Memory()
②不会被压缩和格式转化
③多用于内部存储载体(集群间分发数据)
(3)Set (相似于Redis的set(太监版))
①ENGINE = Set()
②唯一 去重
③写入内存文件后存入磁盘(跟mysql也挺像)
④支持insert,但是不能直接select,只能作为IN右边的条件出场
(4)Join(跟Set比较相似)
①ENGINE = Join(join_strictness, join_type, key1[, key2, ...])
②跟连接查询算是自己人,可以作为join查询的连接表,也可以直接查询
③写入内存文件后同步磁盘
(5)Buffer
①纯内存,用途为缓冲区(插入大体量数据时先怼入buffer之后
满足预设时buffer自动刷新到目标表)
②ENGINE = Buffer(database, table, num_layers, 
min_time, max_time, min_rows, max_rows, 
min_bytes, max_bytes) (时间的最大最小值 &
 行数最大最小值 & 字节数/体量最大最小值)
1)三组条件所有最小阈值满足时触发刷新
2)三组条件至少一个最大阈值满足则触发
3)写入数据行大于最大行数或超过最大体量则触发
③设置的线程们会轮询处理

 


日志系列(果然哪里都逃不开的log)

(1)适用于数据量小于百万,查询场景简单,一次写入多次查询;
(2)均不支持索引,分区,并发读写,支持物理存储。
(3)TinyLog (性能最低)
①存储结构也是数据文件和元数据
②记录数据为json格式
③ENGINE = TinyLog()
(4)StripeLog
①存储结构也是数据文件和元数据还有数据标记(所以支持并行查询)性能比tinyLog要强很多
②ENGINE = StripeLog()
(5)Log
①结合了前两者的优点,存储结构与stripeLog一致,性能最优,用途最广
②ENGINE = Log()
③每个列字段一个bin文件

 

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值