当前位置: 首页 > news >正文

Clickhouse学习(一):MergeTree概述

MergeTree

  • 一、Clickhouse表引擎概述
  • 二、MergeTree表引擎
    • <一>、ReplacingMergeTree引擎
    • <二>、SummingMergeTree引擎
    • <三>、AggregatingMergeTree引擎
  • 三、MergeTree分区

一、Clickhouse表引擎概述

  • MergeTree表引擎:允许根据日期和主键创建索引

    1、ReplacingMergeTree:该引擎和 MergeTree 的不同之处在于它会删除具有相同主键的重复项。数据 的去重只会在合并的过程中出现。因此,ReplacingMergeTree 适用于在后台清除重复的数据以节省空 间,但是它不保证没有重复的数据出现。
    2、SummingMergeTree:把所有具有相同主键的行合并为一行,并添加合并行的聚合值。如果单个键值 对应于大量的行,则可以显著的减少存储空间并加快数据查询的速度。
    3、AggregatingMergeTree:将相同主键的所有行(在一个数据片段内)替换为单个存储一系列聚合函 数状态的行。可以使用 AggregatingMergeTree 表来做增量数据统计聚合,包括物化视图的数据聚合

  • Distributed分布式引擎本身不存储数据,但可以在多个服务器上进行分布式查询

  • 外部存储表引擎,如HDFS、Mysql、JDBC、Kafka、File,相当于外部数据源

  • 内存表引擎,如Memory、Set、Join、Buffer,实现内存加速和各种功能

  • 还有其他如日志表引擎、接口引擎(自定义)、Null表引擎、URL表引擎

二、MergeTree表引擎

在这里插入图片描述
需要注意两点:

  • MergeTree的主键(primary key)只是用来生成一级索引(primary)的,并没有唯一性约束这样的语义;order by决定了每个分区中数据的排序规则,order by可以指代primary key,通常只用声明order by即可
  • 通常只有SummingMergeTree或AggregatingMergeTree的时候,才需要同时设置order by和primary
    key,显式的设置primary key,是为了将主键和排序键设置成不同的值,是进一步优化的体现,比如聚合条件group by a,b,c,过滤条件where A,此时order by a,b,c,primary key a,注意,如果order by和primary key不同,primary key必须是order by的前缀(为了保证分区内数据和逐渐的有序性)

<一>、ReplacingMergeTree引擎

设计为相同分区的数据进行数据去重

  • 使用order by排序键作为唯一键
  • 以分区为单位进行去重,只在分区合并时进行触发
  • 如果参数没设置列,则保留重复数据的最后一行
  • 如果参数设置了列,则保留重复数据中取值最大的一行

<二>、SummingMergeTree引擎

只需要根据group by条件得到汇总结果(sum),不关心明细数据,解决存储和查询的开销

  • 使用order by排序键作为聚合汇总的条件key
  • 以分区为单位进行聚合,只在分区合并时进行触发
  • 如果指定了columns汇总列,则sum汇总这些字段
  • 如果未指定columns汇总列,则sum汇总在所有非主键的数值类型字段
  • 如果order by和primary key的字段不相同,pk列字段必须是order by的前缀,即order by(b,c)
    primary key A不合法
  • 非聚合字段,使用第一行数据的取值

<三>、AggregatingMergeTree引擎

AggregatingMergeTree是SummingMergeTree的升级版。聚合函数通过AggregateFunction实现

  • 使用order by排序键作为聚合数据的条件key
  • 以分区为单位进行聚合,只在分区合并时触发
  • 不需要指定列,但需要通过AggregateFunction声明
  • 写入数据时,需要调用State;读取数据,需要调用Merge
  • 数据不能通过普通的insert插入,而只能通过insert into select

三、MergeTree分区

MergeTree…Partition By toYYYYMM(Date)

  • ClickHouse的表可以根据任意表达式分区
  • 不同分区不会合并
  • 合并可以通过optimize table命令触发
  • 可以对分区进行操作

在MergeTree引擎下,每次insert into,即使数据属于同一个分区,但数据在存储上都会生成一个新的分区目录.目录名为201909_1_1_0
命名规范:
parititionId_minBlockNum_maxBlockNum_level
BlockNum:数据表全局自增,初始值从1开始,新建分区minBlockNum和maxBlockNum相同
Level:合并的次数
在这里插入图片描述

http://www.lryc.cn/news/22703.html

相关文章:

  • Windows离线安装rust
  • Android与flutter混合开发
  • Linux和C语言的学习方法你真的知道吗?
  • 代码随想录day42
  • 【笔记】两台1200PLC进行S7 通信(1)
  • 统一网关Gateway
  • 6、kubernetes(k8s)安装
  • python-批量下载某短视频平台音视频标题、评论、点赞数
  • 【数据结构与算法】单链表的增删查改(附源码)
  • 华为OD机试 - 回文字符串
  • C语言太简单?这14道C语言谜题,你能答对几个
  • Benchmark测试——fio——源码分析
  • 测量 R 代码运行时间的 5 种方法
  • Qt 第9课、计算器中缀转后缀算法
  • docker的使用方法
  • Kafka(五)生产者向发送消息的执行流程
  • 华为OD机试模拟题 用 C++ 实现 - 简易压缩算法(2023.Q1)
  • MATLAB R2022b 安装教程
  • PCI子系统
  • Spring源码之IoC容器的Bean创建和依赖注入,DefaultListableBeanFactory容器为例
  • 解决小程序页面scroll-view块自身滑动问题
  • PowerCommand康明斯发电机控制屏维修HMI211
  • ELK + Kafka 测试
  • 迁移系统:换电脑或者硬盘转移磁盘文件的方法!
  • 职场性别报告,男女薪酬仍有差距,男性平均薪酬比女性高29.7%
  • 5-Azidopentanoic acid,79583-98-5,5-Azidopentanoic COOH具有高效稳定,高特异性
  • 滴滴前端高频react面试题汇总
  • 能在软路由docker给部署搭建teamsperk服务器么?并且设置好ddns
  • 应用统计学实验1-蒙特卡罗方法求解定积分
  • 用Pyhon编写一个属于自己的nmap