Clickhouse学习:MergeTree

news2024/9/30 13:16:36

MergeTree

    • 一、MergeTree逻辑存储结构
    • 二、MergeTree物理存储结构
    • 三、总结

一、MergeTree逻辑存储结构

在这里插入图片描述

  • 如上图所示,在排序键(CountrID、Date)上做索引,数据会按照这两个字段先后排序
  • ClickHouse是稀疏索引,每隔8192行做一个索引,如(a,1),(a,2),比如想查a,要读取[0,3)之间的内容,稀疏索引会导致数据的额外读取
  • CounterID in (a,h),服务器会读取标记号在[0,3)和[6,8)区间中的数据
  • CounterID in (a,h) and Date = 3,服务器会读取标记号在[1,3)和[7,8)区间中的数据
  • 如果只是查Date = 3,那会读取[1,10]中的数据,和mysql索引差不多,遵循最左前缀原则,虽然是稀疏索引,但是效率还是比全表扫描高的
  • ClickHouse不要求主键唯一,所以可以插入多条具有相同主键的行

二、MergeTree物理存储结构

在这里插入图片描述

  • MergeTree表中的数据存储于chunk中(通常是64KB到1MB)
  • 每隔8192行数据,是1个block,主键每隔8192行,取一主键列的数据,存在primary.idx文件中,同时记录这是第几个block
  • 表中的所有列都存在chunk分离的 c o l u m n . b i n 文件中 , 一个列对应一个 column.bin文件中,一个列对应一个 column.bin文件中,一个列对应一个column.bin文件
  • 同样,对于每一列都有带标记的$column.mrk文件,该文件记录的是每个第N行在数据文件中的偏移量,建立了primary.idx与column.bin之间的映射关系

1、查询过程(x、y为主键,z为非主键)

  • 根据查询条件(判断是否主键)
  • 根据primary.idx(常驻内存),找到数据在block的哪个位置
  • 把.mrk文件将数据加载到内存
  • 根据.mrk文件的偏移量找到.bin文件中的数据段

1)、全主键(where x = ‘3’ and y = ‘c’)

  • 判断,只需扫描block
  • 使用.mrk文件,定位到数据
  • 加载内存过滤返回

2)、半主键

  • 若是最左前缀主键,扫描过程同全主键一样
  • 若不是最左前缀主键,扫描过程几乎同非主键一样,存在过滤效果差的情况

3)、非主键(where z = ‘’)

  • 等效于where x = any and y = any and z = ‘’;
  • 取所有block
  • 取所有mrk里的所有数据偏移量,即全扫描
  • 过滤返回

4)、主键+非主键(where x = ‘’ and z = ‘’)

  • 利用主键x,找到x的block,同时也一定是z要过滤的block
  • 取出x、z.mrk文件中的偏移量(定位数据)
  • 加载内存过滤返回

2、写入的过程

  • 当你向MergeTree中插入一堆数据时,数据按主键排序并形成一个新的分块。为了保证分块的数量相对较少,有后台线程定期选择一些分块并将它们合并成一个有序的分块,这就是MergeTree的名称来源
  • MergeTree不是LSM树,因为它不包含memtable和log(HBase是有的,数据写到memtable后就直接返回写入成功,因为有预写日志备份了,所以HBase适合写):插入的数据直接写入文件系统,这使得它仅适用于批量插入数据,而不适用于非常频繁的一行一行插入,大约每秒一次是没问题的,但是每秒一千次就有问题

三、总结

Clickhouse分别吸取了mysql引擎MylSAM和LSM树的长处,索引方面,使用稀疏索引
在数据文件上,沿用LSM树的数据段内数据有序,借助稀疏索引定位数据段
在存储方面,类似MylSAM,将索引文件和数据文件分开,同时引入列存,将索引文件和数据文件按照列字段粒度进行拆分,每个列独立存储

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/373316.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023年三月份图形化四级打卡试题

活动时间 从2023年3月1日至3月21日,每天一道编程题。 本次打卡的规则如下: 小朋友每天利用10~15分钟做一道编程题,遇到问题就来群内讨论,我来给大家答疑。 小朋友做完题目后,截图到朋友圈打卡并把打卡的截图发到活动群…

网络原理之初识

目录 一. 网络互连 1. 局域网 2. 广域网 二. 网络通信基础 1. IP 地址 2. 端口号 3. 网络协议 4. 协议分层 5. TCP/IP 五层网络模型 (简述) 6. 网络数据传输的基本流程 一. 网络互连 随着时代的发展,越来越需要计算机之间互相通信&am…

【华为OD机试模拟题】用 C++ 实现 - IPv4 地址转换成整数(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 去重求和(2023.Q1) 文章目录 最近更新的博客使用说明IPv4 地址转换成整数题目输入输出示例一输入输出说明示例一输入输出说明Code使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,

使用Phpstorm进行项目管理

对于项目管理我们还是使用传统的终端命令行(命令行很重要是基础中的基础)么 ? 不现在我们要通过工具提高我们的效率,作为一名合格的程序猿下班提交代码是我们的基操!!!!但是经过一天…

ctf pwn基础-4

今天是学pwn的第四天,去接触了pwn的整数溢出。 目录 基础 实例讲解 实例讲解2 基础 关于整数溢出,这里以int为例,因为我php之前搞的比较多,以为这个int也是想php一样是64,最大值是9开头的那个,闹了不少笑…

关于程序员中年危机的一个真实案例

​ 关于中年危机,网上已经有了各种各样的解读。但是,这两天一个学员跟我简单几句聊天,却触发了对于中年危机的另一种思考。如果你曾经也有点迷茫,或许你可以稍微花几分钟看下这个故事。 一、无奈的故事 ​ 39岁还出来面试&#x…

论文阅读:NeRF Representing Scenes as Neural Radiance Fields for View Synthesis

论文阅读–NeRF Representing Scenes as Neural Radiance Fields for View Synthesis 这是 2020 ECCV 的一篇文章,记得好像还获得了最佳论文奖的提名,这篇文章相当于将自由视点生成这个方向开辟出了一个新的解决思路。 文章的作者们提出了一种可以对复…

数据结构与算法——1.数据结构概述

从这篇文章开始,我们来讲一下数据结构与算法的相关内容 1.数据结构概述 什么是数据结构? 官方解释: 数据结构是一门研究非数值计算的程序设计问题中的操作对象,以及他们之间的关系和操作等相关问题的学科。 大白话&#xff1…

nodejs+vue+elementui,毕业生导师双选系统 vscode双向选择

为了直观显示系统的功能,运用用例图这样的工具显示分析的结果。分析的导师功能如下。导师管理导师选择信息,管理项目,管理项目提交并对学员提交的项目进行指导。 为了直观显示系统的功能,运用用例图这样的工具显示分析的结果。分析…

XpdfViewer ActiveX 4.0.3 Retail

XpdfViewer 库/ActiveX 控件提供了一个用于 Windows 应用程序的 PDF 文件查看器组件。XpdfViewer 使任何 Windows 开发人员都可以将 PDF 查看功能添加到他们的应用程序中。它为开发人员提供了对 PDF 查看器的完全控制——XpdfViewer 适合您的GUI。 XpdfViewer 功能包括&#xf…

Elasticsearch:索引数据是如何完成的

在我在之前的文章 “Elasticsearch:彻底理解 Elasticsearch 数据操作” 文章中,我详细地描述了如何索引数据到 Elasticsearch 中。在今天的文章中,我想更进一步来描述这个流程。 Elasticsearch 是一个非常强大和灵活的分布式数据系统&#x…

layui框架学习(10:时间线)

时间线,英文timeline,也叫时光轴、时间轴,是指以时间为记录方式的一种网络布局形式,其形式之一为下图所示(示例图来自参考文献5)。   Layui官网教程中的更新日志页面也用了时间线样式,如下图…

【经典蓝牙】 蓝牙HFP层协议分析

HFP 概述 HFP概念介绍 HFP(Hands-Free Profile), 是蓝牙免提协议, 可以让蓝牙设备对对端蓝牙设备的通话进行控制,例如蓝牙耳机控制手机通话的接听、 挂断、 拒接、 语音拨号等。HFP中蓝牙两端的数据交互是通过定义好的AT指令来通讯的。 &am…

C语言指针易错点—字符数组与字符指针

C语言指针易错点—字符数组与字符指针字符数组与字符指针的区别字符数组与字符指针的区别举例字符指针必须先赋值,后引用字符数组与字符指针的区别 因为字符数组与字符指针都可以表示字符串,但他们不是等价的。下面就来讲讲他们的区别。 char sa[ ] &…

信号类型(雷达)——脉冲雷达(三)

系列文章目录 《信号类型(雷达通信)》 《信号类型(雷达)——雷达波形认识(一)》 《信号类型(雷达)——连续波雷达(二)》 文章目录 前言 一、相参雷达 1…

第一章 计算机视觉概述

《计算机视觉开发实战 基于Python》 朱文伟,李建英 著 1.1 图像的基本概念 图像和图形 图像是输入设备捕捉的实际画面产生的数字图像,由像素点构成的位图。图形是用数学规则产生的或具有一定规则的团,由外部轮廓线条构成的矢量图,往往用一组…

有趣的Hack-A-Sat黑掉卫星挑战赛——卫星平台内存dump

国家太空安全是国家安全在空间领域的表现。随着太空技术在政治、经济、军事、文化等各个领域的应用不断增加,太空已经成为国家赖以生存与发展的命脉之一,凝聚着巨大的国家利益,太空安全的重要性日益凸显[1]。而在信息化时代,太空安…

AI_Papers周刊:第三期

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 2023.02.20—2023.02.26 文摘词云 Top Papers Subjects: cs.CL 1.LLaMA: Open and Efficient Foundation Language Models 标题:LLaMA:开放高效的基础语言模型 作者&#…

14、KL散度

KL 散度,是一个用来衡量两个概率分布的相似性的一个度量指标。 现实世界里的任何观察都可以看成表示成信息和数据,一般来说,我们无法获取数据的总体,我们只能拿到数据的部分样本,根据数据的部分样本,我们会…

5、算法MATLAB---矩阵的运算和索引

矩阵的运算和索引1、矩阵的运算1.1 获取矩阵的行列数1.2 矩阵转置、逆矩阵1.3 特征值和特征向量1.4 加减乘除乘方运算1.5 广播机制1.6 逻辑运算2、矩阵的索引1、矩阵的运算 1.1 获取矩阵的行列数 使用size函数 1.2 矩阵转置、逆矩阵 使用【】和inv函数 1.3 特征值和特征…