ClickHouse面向列的数据库管理系统(原理简略理解)

目录

官网

什么是Clickhouse

什么是OLAP

面向列的数据库与面向行的数据库

特点

为什么面向列的数据库在OLAP场景中工作得更好

为什么ClickHouse这么快

真实的处理分析查询

OLAP场景的关键属性

引擎作用

ClickHouse引擎

输入/输出

CPU


官网

https://clickhouse.com/

什么是Clickhouse

ClickHouse®是一个高性能、面向列的SQL数据库管理系统(DBMS),用于在线分析处理(OLAP)。它可以作为开源软件和云服务提供。

什么是OLAP

OLAP方案要求在大型数据集上实时响应,以满足具有以下特征的复杂分析查询:

  • 数据集可以是巨大的-数十亿或数万亿行
  • 数据是在包含许多列的表中组织的
  • 仅选择少数几列来回答任何特定查询
  • 结果必须以毫秒或秒为单位返回

面向列的数据库与面向行的数据库

在面向行的DBMS中,数据存储在行中,与行相关的所有值物理上彼此相邻地存储。

在面向列的DBMS中,数据存储在列中,来自相同列的值存储在一起。

特点

1、列式存储:

行式存储的好处:

想查找某个人所有的属性时,可以通过一次磁盘查找加顺序读取就可以;但是当想查所有人的年龄时,需要不停的查找,或者全表扫描才行,遍历的很多数据都是不需要的。

列式存储的好处

  • 对于列的聚合、计数、求和等统计操作优于行式存储
  • 由于某一列的数据类型都是相同的,针对于数据存储更容易进行数据压缩,每一列选择更优的数据压缩算法,大大提高了数据的压缩比重
  • 数据压缩比更好,一方面节省了磁盘空间,另一方面对于cache也有了更大的发挥空间
  • 列式存储不支持事务

2、DBMS功能:几乎覆盖了标准 SQL 的大部分语法,包括 DDL 和 DML、,以及配套的各种函数;用户管理及权限管理、数据的备份与恢复

3、多样化引擎:目前包括合并树、日志、接口和其他四大类20多种引擎。

4、高吞吐写入能力:

ClickHouse采用类LSM Tree的结构,数据写入后定期在后台Compaction。通过类 LSM tree的结构, ClickHouse在数据导入时全部是顺序append写,写入后数据段不可更改,在后台compaction时也是多个段merge sort后顺序写回磁盘。顺序写的特性,充分利用了磁盘的吞吐能力。

5、数据分区与线程及并行:

ClickHouse将数据划分为多个partition,每个partition再进一步划分为多个index granularity(索引粒度),然后通过多个CPU核心分别处理其中的一部分来实现并行数据处理。在这种设计下, 单条 Query 就能利用整机所有 CPU。 极致的并行处理能力,极大的降低了查询延时。

所以, ClickHouse 即使对于大量数据的查询也能够化整为零平行处理。但是有一个弊端就是对于单条查询使用多cpu,就不利于同时并发多条查询。所以对于高 qps 的查询业务并不是强项。

6、ClickHouse 像很多 OLAP 数据库一样,单表查询速度优于关联查询,而且 ClickHouse的两者差距更为明显。

关联查询:clickhouse会将右表加载到内存。

为什么面向列的数据库在OLAP场景中工作得更好

面向列的数据库更适合OLAP场景:它们在处理大多数查询时至少快100倍。下面详细解释了原因,但事实更容易直观地展示:

面向行的DBMS

面向列的DBMS

看到区别了吗?

本文的其余部分将解释为什么面向列的数据库在这些场景中工作得很好,以及为什么ClickHouse在这一类别中表现得特别好。

为什么ClickHouse这么快

ClickHouse充分利用所有可用的系统资源,尽可能快地处理每个分析查询。这是由于分析能力和关注实现最快OLAP数据库所需的低级细节的独特组合而成为可能。

  • C++可以利用硬件优势
  • 摒弃了hadoop生态
  • 数据底层以列式存储
  • 利用单节点的多核并行处理
  • 为数据建立索引一级、二级、稀疏索引
  • 使用大量的算法处理数据
  • 支持向量化处理
  • 预先设计运算模型-预先计算
  • 分布式处理数据

真实的处理分析查询

在面向行的DBMS中,数据按以下顺序存储:

RowWatchIDJavaEnableTitleGoodEventEventTime
#0893543506621Investor Relations12016-05-18 05:19:20
#1903295099580Contact us12016-05-18 08:10:20
#2899537060541Mission12016-05-18 07:38:00
#N

换句话说,与行相关的所有值在物理上彼此相邻地存储。

面向行的DBMS的示例是MySQL、Postgres和MS SQL Server。

在面向列的DBMS中,数据是这样存储的:

Row:#0#1#2#N
WatchID:893543506629032950995889953706054
JavaEnable:101
Title:Investor RelationsContact usMission
GoodEvent:111
EventTime:2016-05-18 05:19:202016-05-18 08:10:202016-05-18 07:38:00

这些示例仅显示数据的排列顺序。不同列中的值单独存储,而同一列中的数据存储在一起。

列式DBMS示例:Vertica、Paraccel(Actian Matrix和Amazon Redshift)、Sybase IQ、Exasol、Infobright、InfiniDB、MonetDB(VectorWise和Actian Vector)、LucidDB、SAP HANA、Google Dremel、Google PowerDrill、Druid和kdb+。

存储数据的不同顺序更适合不同的场景。数据访问场景指的是进行什么查询、多久查询一次、占多大比例;每种类型查询读取的数据量-行、列和字节;阅读和更新数据之间的关系;数据的工作大小以及如何在本地使用它;是否使用事务,以及它们的隔离程度;数据复制和逻辑完整性要求;对于每种类型的查询的等待时间和吞吐量的要求,等等。

系统上的负载越高,定制系统设置以匹配使用场景的需求就越重要,并且这种定制变得越细粒度。没有一个系统同样适合于显著不同的场景。如果一个系统适用于一组广泛的场景,在高负载下,该系统将同样糟糕地处理所有场景,或者将仅对一个或几个可能的场景工作良好。

OLAP场景的关键属性

  • 表是“宽”的,这意味着它们包含大量的列。
  • 数据集很大,查询在处理单个查询时需要高吞吐量(每个服务器每秒高达数十亿行)。
  • 列值相当小:数字和短字符串(例如,每个URL 60个字节)。
  • 查询提取大量的行,但只提取列的一小部分。
  • 对于简单查询,允许大约50ms的延迟。
  • 每个查询有一个大表;所有的桌子都很小,除了一个。
  • 查询结果明显小于源数据。换句话说,数据被过滤或聚合,因此结果适合单个服务器的RAM。
  • 查询相对较少(通常每台服务器有数百个查询或每秒更少)。
  • 插入是以相当大的批量(1000行)进行的,而不是以单行进行的。
  • 交易是不必要的。

很容易看出,OLAP场景与其他流行场景(如OLTP或键值访问)有很大不同。因此,如果您想获得良好的性能,那么尝试使用OLTP或键值数据库来处理分析查询是没有意义的。例如,如果您尝试使用MongoDB或Redis进行分析,与OLAP数据库相比,您将获得非常差的性能。

引擎作用

表引擎是 ClickHouse 的一大特色。可以说, 表引擎决定了如何存储表的数据。包括:

  • 数据的存储方式和位置
  • 支持哪些查询以及如何支持
  • 并发数据访问
  • 索引的使用
  • 是否可以执行多线性请求
  • 数据复制参数

ClickHouse引擎

引擎决定了数据的存储位置、存储结构、表的特征(是否修改操作DDL、DDL、是否支持并发操作)

1、数据库引擎:数据库引擎 | ClickHouse文档

目前支持的数据库引擎有5种:

  • Ordinary:默认引擎,在绝大多数情况下我们都会使用默认引擎,使用时无须刻意声明。在此数据库下可以使用任意类型的表引擎。
  • Dictionary:字典引擎,此类数据库会自动为所有数据字典创建它们的数据表
  • Memory:内存引擎,用于存放临时数据。此类数据库下的数据表只会停留在内存中,不会涉及任何磁盘操作,当服务重启后数据会被清除
  • Lazy:日志引擎,此类数据库下只能使用Log系列的表引擎
  • MySQL:MySQL引擎,将远程的MySQL服务器中的表映射到ClickHouse中,常用语数据的合并。
  • MaterializeMySQL:MySQL数据同步;将MySQL数据全量或增量方式同步到clickhouse中,解决mysql服务并发访问压力过大的问题

2、表引擎:表引擎 | ClickHouse文档

 

输入/输出

  1. 对于分析查询,只需要读取少量的表列。在面向列的数据库中,可以只读取所需的数据。例如,如果您需要100列中的5列,则可以预期I/O减少20倍。
  2. 由于数据是以包的形式读取的,因此更容易压缩。列中的数据也更容易压缩。这进一步减少了I/O量。
  3. 由于减少了I/O,系统缓存中可以容纳更多数据。

例如,查询“统计每个广告平台的记录数”需要阅读一个“广告平台ID”列,该列未压缩时占用1个字节。如果大部分流量不是来自广告平台,那么您可以预期此列的压缩至少为10倍。当使用快速压缩算法时,数据解压缩可以以每秒至少几千兆字节的未压缩数据的速度进行。换句话说,在单个服务器上可以以每秒大约几十亿行的速度处理该查询。这个速度在实践中实际上是可以实现的。

CPU

由于执行查询需要处理大量的行,因此将所有操作分派给整个向量而不是单独的行,或者实现查询引擎,以便几乎没有分派成本。如果不这样做,那么对于任何不太好的磁盘子系统,查询解释器都不可避免地会使CPU停止工作。将数据存储在列中并在可能的情况下按列处理数据是有意义的。

有两种方法可以做到这一点:

  1. 矢量引擎。所有操作都是针对向量而不是针对单独的值编写的。这意味着您不需要经常调用操作,并且调度成本可以忽略不计。操作代码包含优化的内部循环。

  2. 代码生成。为查询生成的代码中包含所有间接调用。

这在面向行的数据库中是不可能的,因为在运行简单查询时这是没有意义的。然而,也有例外。例如,MemSQL使用代码生成来减少处理SQL查询时的延迟。(For相比之下,分析型DBMS需要优化吞吐量,而不是延迟。)

请注意,为了提高CPU效率,查询语言必须是声明性的(SQL或MDX),或者至少是向量(J,K)。查询应该只包含隐式循环,以便进行优化。

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

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

相关文章

Flink-CDC 抽取SQLServer问题总结

Flink-CDC 抽取SQLServer问题总结 背景 flink-cdc 抽取数据到kafka 中,使用flink-sql进行开发,相关问题总结flink-cdc 配置SQLServer cdc参数 1.创建CDC 使用的角色, 并授权给其查询待采集数据数据库 -- a.创建角色 create role flink_role;-- b.授权…

Direct3D融合技术

该技术能使我们将当前要进行光栅化的像素的颜色与先前已已光栅化并处于同一位置的像素的颜色进行合成,即将正在处理的图元颜色值与存储在后台缓存中的像素颜色值进行合成(混合),利用该技术我们可得到各种各样的效果,尤其是透明效果。 在融合…

华为云云耀云服务器L实例评测|云耀云服务器L实例的购买及使用体验

华为云云耀云服务器L实例评测|云耀云服务器L实例的购买及使用体验 一、云耀云服务器L实例介绍1.1 云耀云服务器L实例简介1.2 云耀云服务器L实例特点1.3 云耀云服务器L实例使用场景 二、云耀云服务器L实例支持的镜像2.1 镜像类型2.2 系统镜像2.3 应用镜像 三、购买云…

docker学习:dockerfile和docker-compose

学习如何使用dockerfile 以下内容,部分来自gpt生成,里面的描述可能会出现问题,但代码部分,我都会进行测试。 1. 需求 对于一个docker,例如python,我们需要其在构建成容器时,就有np。有以下两种方…

Qt重写QTreeWidget实现拖拽

介绍 此文章记录QTreeWidget的重写进度,暂时停滞使用,重写了QTreeWidget的拖拽功能,和绘制功能,自定义了数据结构,增加复制,粘贴,删除,准备实现动态刷新数据支持千万数据动态刷新&a…

Prometheus-Rules 实战

文章目录 1 node rules2 nginx rule2.1 Nginx 4xx 错误率太多2.2 Nginx 5xx 错误率太多2.3 Nginx 延迟高 3 mysql rule3.1 MySQL 宕机3.2 实例连接数过多3.3 MySQL高线程运行3.4 MySQL 从服务器 IO 线程没有运行3.5 MySQL 从服务器 SQL 线程没有运行3.6 MySQL复制滞后3.7 慢查询…

天津专升本文化课考试计算机应用基础考试大纲(2023年9月修订)

天津市高等院校“高职升本科”招生统一考试计算机应用基础考试大纲(2023年9月修订) 一、考试性质 天津市高等院校“高职升本科”招生统一考试是由合格的高职高专毕业生参加的选拔性 考试。高等院校根据考生的成绩,按照已确定的招生计划&am…

transformer系列2---transformer架构详细解析

transformer详细解析 Encoder1 输入1.1 Embedding 词嵌入1.1.1 Embedding 定义1.1.2 几种编码方式对比1.1.3 实现代码 1.2 位置编码1.2.1 使用位置编码原因1.2.2 位置编码方式1.2.3 位置编码代码 2 注意力 Attention2.1 自注意力self-attention2.1.1 QKV含义2.1.2 自注意力公式…

Innodb底层原理与Mysql日志机制

MySQL内部组件结构 Server层 主要包括连接器、词法分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现&#xff0c…

【Vue】路由与Node.js下载安装及环境配置教程

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的专栏《Vue快速入门》。🎯🎯 &…

无涯教程-JavaScript - COUNT函数

描述 COUNT函数计算包含数字的单元格的数量,并计算参数列表中的数字。使用COUNT函数获取在数字范围或数字数组中的数字字段中的条目数。 语法 COUNT (value1, [value2] ...)争论 Argument描述Required/Optionalvalue1The first item, cell reference, or range within whic…

React TypeScript | 快速了解 antd 的使用

1. 安装: 就像安装其他插件库一样,在项目文件夹下执行: npm install antd --save如果你安装了 yarn,也可以执行: yarn add antd2. 引用 import { Button, Tooltip } from "antd"; import "antd/dis…

第三、四、五场面试

第三场 共享屏幕做题(三道简单题) 替换空格成%20(双指针) 删除升序链表中的重复元素(指针)有效的括号(栈) 第四场、第五场 自我介绍 项目拷打 整个项目架构rpc模块的情况分析的数…

云渲染是怎么做到不排队的

云渲染排队严重影响了用户的使用体验,还会导致用户的流失,因此解决渲染不排队的问题对于云渲染平台来说是非常重要的。而作为云渲染平台,自己的机器基本都是固定的,哪如何解决用户渲染排队的问题呢?我们一起来看看全国…

JOSEF约瑟 剩余电流继电器PFR-5 PFE-W-20 国产化改造ZLR-G81 ZCT-45

系列型号: PFR-003剩余电流继电器 PFR-03剩余电流继电器 PFR-5剩余电流继电器 PFR-W-105互感器 PFR-W-140互感器 PFR-W-20互感器 PFR-W-210互感器 PFR-W-30互感器 PFR-W-35互感器 PFR-W-70互感器 一、用途 PFR剩余电流继电器(以下简称继电器…

蓝桥杯 题库 简单 每日十题 day3

01 约数个数 题目描述 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。 1200000 有多少个约数(只计算正约数)。 解题思路 枚举,从1开始一直到1200000本身都作为1200000的除数,…

机器学习——奇异值分解(未完)

开坑,刚看完书,已经有些窒息了 先把坑挖了,再慢慢填,避免自己划水跳过 我爱线代,线代爱我,阿弥陀佛 为什么要学奇异值分解? 因为书本倒数第二章专门提到的,想必一定很重要&#xff…

GitHub无法访问的解决方法

每次刚装完系统我们访问GitHub就会出现无法访问的情况,此时只需要修改host文件将可访问的dns解析地址写入进去即可。 查询DNS 使用dns监测查询工具 https://tool.chinaz.com/dns https://dnsdaquan.com/ 输入无法访问的IP github.com 进行检测 查询到可访问的i…

iOS“超级签名”绕过App Store作弊解决方案

一直以来,iOS端游戏作弊问题都是游戏行业的一大痛点。在当下游戏多端互通的潮流下,游戏作为一个整体,无论哪一端出现安全问题,都会造成更加严重的影响。因此,iOS端游戏安全保护也同样十分重要。 iOS独特的闭源生态&am…

HOOPS Visualize 2023 SP2 U1 Crack-HOOPS Visualize

HOOPS Visualize 是一个以工程为中心的高性能图形库,用于在桌面、移动和 AR/VR 设备上渲染 3D CAD 模型。该 3D 图形库具有线程安全的 C 和 C# 接口以及 OpenGL 和 DirectX 驱动程序,并由响应迅速的专业图形专家提供支持。通过访问最新的 3D GPU 功能&am…