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

Clickhouse 为什么这么快

Clickhouse 的缘起

Clickhouse 最初是为 Yandex.Metrica 这个世界上第二大的Web分析平台开发的,并且一直是这个系统的核心组件。ClickHouse在Yandex.Metrica中的主要任务是使用非聚合数据在在线模式下构建报告,使用374台服务器组成的集群,在数据库中存储的数据超过20.3万亿行,压缩后的数据量约为2PB,未压缩的数据量(TSV格式)大约17PB。

Clickhouse 是一款面向数据仓库提供实时计算的产品,传统数仓普遍存在计算效率低、查询和写入延时高、投资和运维成本高等缺陷。Clickhouse 放弃了很多传统数据仓库习以为常的设计,致力于充分发挥单机性能优势,提供低成本、高效率的实时数据仓库环境。今天我们就来分析,Clickhouse 是如何通过精妙的存储引擎和计算引擎来实现这些目标的。

Clickhouse 为什么这么快

向量化的存储引擎

Clickhouse 是一款列式存储数据库。数据库表通常包含数十甚至数百的列,而分析计算只会使用其中的几个列。行存读取时将整行数据读取到内存中,然后再选择相关的列进行计算,而列式存储仅读取需要参与计算的列,因此列存能够极大的降低数据分析过程中需要读取的数据量。

而在计算引擎设计上,Clickhouse 首次使用了向量化计算引擎,借助于CPU提供的SIMD(Single Instruction Multiple Data,单指令多数据流)技术,可以充分发挥现代计算机体系架构的优势,最大限度的压榨单机性能。在实际使用中,百亿以下的单表基本上使用单机就可以处理,这种处理能力已经可以满足绝大多数企业的需求,也在很大程度上解决了传统数据仓库系统效率低和成本高的问题。

在这里插入图片描述

高比例的数据压缩

列存为Clickhouse 带来另一个非常明显的优势是大幅提高了数据压缩空间。列存是将同一列数据存储在连续的空间上,字段类型都是相同的,数据相似度更高,相比于行存数据,能够提供更高的数据压缩比,从而大幅减少压缩后的数据大小,降低磁盘的I/O时间。

实际项目中,Clickhouse 的数据压缩比能够达到8:1,即8T数据压缩后只需要1T的存储空间。Yandex.Metrica 未压缩数据17PB,压缩后2PB,压缩比也接近8:1。

高效的I/O优化

超高的压缩比例为Clickhouse 带来了更低的数据存储成本和I/O访问开销,同时也带来了额外的计算开销 – 数据解压缩。数据压缩后存储到磁盘上,访问时需要进行解压还原数据,之后才能参与分析和计算。如何最大程度减少解压时间,甚至在数据被程序读取前就过滤掉不相干的数据,成为具备压缩能力引擎的一大挑战。

Clickhouse 底层存储引擎使用MergeTree,为了应对海量数据查询和管理需求,Clickhouse 使用了一种和B树索引完全不同的索引结构 – 稀疏索引。

Clickhouse 批量数据插入形成一个最小的存储单元,称为Part,每个Part中的数据按照主键排序,表是由多个Part组成的。

ClickHouse 的表通常都比较大,因此表中的数据通常都是先按照分区键被划分为多个分区,分区键常采用日期的方式,比如下图中按照月份分区。分区表的Part归属于某一个分区,为了实现高效的数据存储,ClickHouse会在后台定期对归属于同一个分区的Part进行合并。

在这里插入图片描述

每个数据Part被逻辑上拆分为多个颗粒(granules),granules是Clickhouse访问时读取的最小数据集,不可分割。granules中的第一行用该行的主键值来标记,这个标记保存在 Part 的索引文件中,Clickhouse 会为每个granules创建独立的索引文件。不仅仅是主键,每一列都会存储类似的标记,可以通过这些标记直接在列文件中查找数据。

在这里插入图片描述

和B树索引主键和数据一一对应的结构不同,稀疏索引的数据并没有精确到行,而是通过索引文件中的Mark快速定位到数据所在的granules;然后将定位到的候选granules以并行流的方式加载到ClickHouse引擎,找到最终匹配的数据。这种索引最大的好处是主键索引占用的存储空间很小,扫描的效率也很高,非常适合海量数据分析中的范围查询。

简单举例

以下是一个简单的数据查询过程,通过这个过程我们可以了解到如何从Clickhouse中获取到最终数据。

select count(distinct action) where date=toDate(2020-01-01) and city=’bj’
  1. 查找primary.idx并找到对应的Mark集合(即数据block集合);
  2. 对于要读取的每个列根据.mrk文件定位到Mark对应在数据文件.bin中的数据offset;
  3. 读取到对应的数据,供后续计算。

Clickhouse 的不足

天下没有免费的午餐,ClickHouse在提供超强查询性能的同时,也会在其他方面做一些取舍。

  • 没有完全成熟的事务能力;
  • 对于已存在的数据,缺乏高效的数据修改和删除能力;
  • 稀疏索引使得ClickHouse在按键值检索单行的点查询时效率不高。

写在最后

任何架构都不是万能的,都有其自身的优点,在获取这些优点的同时也存在局限。尽管ClickHouse还存在着些许的不足,使得其并不适合作为OLTP型的数据库,但并不妨碍其成为优秀的MPP架构数据仓库。

国内诸如字节跳动、腾讯、携程、滴滴出行等众多头部互联网公司,都在使用ClickHouse作为分析查询引擎,提供业务决策、用户画像等场景。在当前基础架构国产化的背景下,还有一众公司基于ClickHouse推出了自己的数据仓库产品,将ClickHouse的产品和理念推广到更广阔的领域。

相关文章:

Clickhouse 为什么这么快

Clickhouse 的缘起 Clickhouse 最初是为 Yandex.Metrica 这个世界上第二大的Web分析平台开发的,并且一直是这个系统的核心组件。ClickHouse在Yandex.Metrica中的主要任务是使用非聚合数据在在线模式下构建报告,使用374台服务器组成的集群,在…...

后仿真中《建立违例和保持违例》你死板思维了吗?

最近胡乱翻翻一些大佬的博客文章,忽然看到了关于clock skew 的一篇文章,文章的链接贴在这里,供大家查阅。《Clock skew (qq.com)》。那么,这篇文章与今天的主题,由什么关系呢? 是因为,从中看到了关于时序违例的解读。UP主对保持时间和建立时间的解读,是从另一个角度,…...

springboot启动时替换配置参数

SpringBoot启动时配置参数替换 一.背景 SpringBoot项目启动的时候,在不使用配置中心等的前提下或者有公司强制使用指定的“密码箱”情况下,需要远程获取关键配置信息,比如数据库密码,则需要在项目启动前获取配置并且进行本地配置…...

postgres数据库中如何看查询是否走索引,以及在什么情况下走索引

在 PostgreSQL 中,可以通过 EXPLAIN 或 EXPLAIN ANALYZE 查看查询计划,以判断查询是否使用了索引。除此之外,了解索引的使用条件对于优化查询性能也很重要。 1. 如何查看查询是否使用索引 使用 EXPLAIN 查看查询计划 EXPLAIN 显示 PostgreSQL 如何执行查询,包括是否使用索…...

AI预测福彩3D采取888=3策略+和值012路或胆码测试9月7日新模型预测第80弹

经过近80期的测试,当然有很多彩友也一直在观察我每天发的预测结果,得到了一个非常有价值的信息,那就是9码定位的命中率非常高,70多期一共只错了8次,这给喜欢打私房菜的朋友提供了极高价值的预测结果~当然了&#xff0c…...

MQTT broker搭建并用SSL加密

系统为centos,基于emqx搭建broker,流程参考官方。 安装好后,用ssl加密。 进入/etc/emqx/certs,可以看到 分别为 cacert.pem CA 文件cert.pem 服务端证书key.pem 服务端keyclient-cert.pem 客户端证书client-key.pem 客户端key 编辑emqx配…...

深度剖析AI情感陪伴类产品及典型应用 Character.ai

前段时间AI圈内C.AI的受够风波可谓是让大家都丈二摸不着头脑,连C.AI这种行业top应用都要找谋生方法了!投资人摸不着头脑,用户们更摸不着头脑。在这之前断断续续玩了一下这款产品,这次也是乘着这个风波,除了了解一下为什…...

[数据集][目标检测]街头摊贩识别检测数据集VOC+YOLO格式758张1类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):758 标注数量(xml文件个数):758 标注数量(txt文件个数):758 标注类别…...

面试准备-3

BIO/NIO/AIO区别的区别? 同步阻塞IO : 用户进程发起一个IO操作以后,必须等待IO操作的真正完成后,才能继续运行。 同步非阻塞IO: 客户端与服务器通过Channel连接,采用多路复用器轮询注册的Channel。提高吞吐量和可靠性。用户进程发…...

Unity教程(十五)敌人战斗状态的实现

Unity开发2D类银河恶魔城游戏学习笔记 Unity教程(零)Unity和VS的使用相关内容 Unity教程(一)开始学习状态机 Unity教程(二)角色移动的实现 Unity教程(三)角色跳跃的实现 Unity教程&…...

利用深度学习实现验证码识别-3-ResNet18

在当今数字化时代,验证码作为一种重要的安全验证手段,广泛应用于各种网络场景。然而,传统的验证码识别方法往往效率低下,准确率不高。今天,我们将介绍一种基于 ResNet18 的验证码识别方法,它能够高效、准确…...

UDP通信实现

目录 前言 一、基础知识 1、跨主机传输 1、字节序 2、主机字节序和网络字节序 3、IP转换 2、套接字 3、什么是UDP通信 二、如何实现UDP通信 1、socket():创建套接字 2、bind():绑定套接字 3、sendto():发送指定套接字文件数据 4、recvfrom():接收指定地址信息的数据 三…...

windows下使用vscode编写运行以及调试C/C++

vscode支持类似于vs的断点调试c/c,也可以直接编译&运行c/c 先是编译运行 c/c的方法 微软官方起初设定的科学做法(这也是现在的科学做法)是通过在vscode集成控制台写命令行的方式来实现编译运行程序的,但也可以通过code runner插件…...

python容器4--集合

(1) 什么是集合 集合:Python中使用关键字set表示 集合中存储多个、没有顺序的、不能重复的、可以是不同类型的多个数据! (2) 集合的声明 python中通过set()或者花括号声明空集合、非空集合 # 声明空集…...

MySQL record 01 part

更改密码: alter user rootlocalhost identified with mysql_native_password by ‘123456’; 注意: 在命令行方式下,每条MySQL的命令都是以分号结尾的,如果不加分号,MySQL会继续等待用户输入命令,直到MyS…...

2024年高教社杯全国大学生数学建模竞赛A题思路(2024数学建模国赛A题思路)

A题 “板凳龙” 闹元宵 “板凳龙”,又称“盘龙”,是浙闽地区的传统地方民俗文化活动。人们将少则几十条,多则上百条的板凳首尾相连,形成蜿蜒曲折的板凳龙。盘龙时,龙头在前领头,龙身和龙尾相随盘旋,整体呈圆盘状。一般来说,在舞龙队能够自如地盘入和盘出的前提下,盘龙…...

Go语言基础语法 20240904更新

代码开源地址 https://github.com/zhangdapeng520/zdpgo_basic 快速入门 示例代码: package mainimport "fmt"func main() {fmt.Println("Hello World") }第一行代码 package 用来声明包名。main包时整个程序的入口包,在一个Go语…...

软件测试 | 性能测试

性能测试的概念 为了 发现系统性能问题 或 获取系统性能相关指标 而进行的测试。 常见性能测试指标 并发数 即并发用户数。 从业务层面看,并发用户数指的是 实际使用系统的用户总数。从后端服务器层面看,指的是 web服务器在一段时间内处理浏览器请求而建…...

Arduino IDE

Arduino IDE(集成开发环境)的安装过程是一个相对直观且易于操作的流程,主要步骤包括下载、安装和配置。以下将详细阐述Arduino IDE的安装过程,同时提供一些背景信息和注意事项,确保安装过程顺利进行。 一、Arduino ID…...

统计学习方法与实战——统计学习方法之感知机

感知机 感知机三要素分析模型策略损失函数选择 算法原始形式对偶形式 相关问题 例子iris数据集分类实战数据集查看 显示结果sklearn 实战感知机 习题解答习题2.1解题步骤反证法 习题2.2习题2.3凸壳线性可分线性可分证明凸壳不相交证明充分性:凸壳不相交\Rightarrow⇒…...

语言学习有捷径?没错!这4个方法让你轻松搞定英语翻译

现在全世界都在用英语,这门语言真的超级重要。不管你是学习、上班还是出去玩,会点英语翻译肯定能帮上大忙。但是,对很多人来说,翻译英语还是挺难的。别急,今天我就来给你介绍几个超好用的英语翻译工具,让你…...

聊一聊大型网站稳定性建设思路

目录 架构阶段的稳定性建设项目 编码阶段的稳定性建设 测试阶段的稳定性建设 发布阶段的稳定性建设 运行阶段的稳定性建设项目 故障发生时的稳定性建设 网站稳定性的建设是一项综合的系统工程,就像人的健康一样,如果平时不注意健康饮食、不注意锻炼…...

Nginx常用配置

Windows版本Nginx开机自启动 可直接下载已经配置好的文件,点击即可下载:Windows版本Nginx1.26.0 下载WinSW v2.12.0 首先从https://github.com/winsw/winsw/releases下载WinSW v2.12.0 下载Nginx 下载地址https://nginx.org/en/download.html 修…...

前端开发中遇到的小问题以及解决方案记录2

1、H5中适配屏幕的工具-postcss-px-to-viewport postcss-px-to-viewport。因为设计稿一般给的都是375px宽度的,所以假如一个字体是16px,那么在开发中不能直接写死为16px,因为各个厂商的手机屏幕大小是不同的,所以要根据屏幕大小去…...

Qt-常用控件(3)-输入类

1. QLineEdit QLineEdit 用来表示单行输入框.可以输入一段文本,但是不能换行 核心属性 属性说明text输入框中的文本inputMask输入内容格式约束maxLength最大长度frame是否添加边框echoMode显示方式. QLineEdit::Normal :这是默认值,文本框会显示输入的文本。QLineE…...

使用Docker启动Redis容器并映射端口

在现代软件开发中,Redis 是一种非常流行的开源内存数据结构存储,通常用作数据库、缓存或消息传递系统。Docker 是一个开源的应用容器引擎,它允许开发者打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux …...

用fastapi搭建cpca地址提取服务接口

以前的客户地址比较乱,现在想提取出省份城市, 开始了解分词技术,后发现python有这样的库 cpca提取地址挺不错,可以从垃圾地址中提取省市区以及区号。 文章会用fastapi搭建服务端 通过post调用cpca,提取来了后&#…...

libvncclient编写多线程qt的VNC客户端

概述 使用qt和libvncclient编写vnc的客户端程序,多线程读写,拒绝卡顿。qt环境:5.15.3libvncclient:0.9.14下载地址:https://github.com/LibVNC/libvncserver/releases 编译libvncclient 打开CMakeList文件&#xff…...

视频处理基础之gradio框架实现

这些函数是用于处理视频文件的Python代码片段,它们依赖于ffmpeg和ffprobe工具,这些工具是FFmpeg项目的一部分,用于处理视频和音频数据。下面是每个函数的用途和用法的总结: 1. ffmpeg_installed() 函数: - 用途&am…...

黑马点评2——商户查询缓存(P37店铺类型查询业务添加缓存练习题答案)redis缓存、更新、穿透、雪崩、击穿、工具封装

文章目录 什么是缓存?添加Redis缓存店铺类型查询业务添加缓存练习题 缓存更新策略给查询商铺的缓存添加超时剔除和主动更新的策略 缓存穿透缓存空对象布隆过滤 缓存雪崩解决方案 缓存击穿解决方案基于互斥锁方式解决缓存击穿问题基于逻辑过期的方式解决缓存击穿问题…...