【入门篇】ClickHouse最优秀的开源列式存储数据库

文章目录

  • 一、什么是ClickHouse?
    • OLAP场景的关键特征
    • 列式数据库更适合OLAP场景的原因
      • 输入/输出
      • CPU
    • 1.1 ClickHouse的定义与发展历程
    • 1.2 ClickHouse的版本介绍
  • 二、ClickHouse的主要特性
    • 2.1 高性能的列式存储
    • 2.2 实时的分析查询
    • 2.3 高度可扩展性
    • 2.4 数据压缩
    • 2.5 SQL支持
    • 2.6 数据复制和容错
  • 三、ClickHouse与其他数据库的对比
    • 3.1 与传统的关系型数据库对比
      • 3.1.1 数据模型
      • 3.1.2 性能
      • 3.1.3 可扩展性
      • 3.1.4 适用场景
      • 3.1.5 SQL支持
      • 3.1.6 数据压缩
    • 3.2 与其他的列式数据库对比
  • 四、ClickHouse的应用场景
    • 4.1 大数据实时分析
    • 4.2 日志分析系统
    • 4.3 时序数据存储

一、什么是ClickHouse?

在这里插入图片描述

ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS)。
在这里插入图片描述

在传统的行式数据库系统中,数据按如下顺序存储:

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

处于同一行中的数据总是被物理的存储在一起。

常见的行式数据库系统有:MySQLPostgresMS SQL Server

在列式数据库系统中,数据按如下的顺序存储:

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

这些示例只显示了数据的排列顺序。来自不同列的值被单独存储,来自同一列的数据被存储在一起。

常见的列式数据库有: 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场景的关键特征

  • 绝大多数是读请求
  • 数据以相当大的批次(> 1000行)更新,而不是单行更新;或者根本没有更新。
  • 已添加到数据库的数据不能修改。
  • 对于读取,从数据库中提取相当多的行,但只提取列的一小部分。
  • 宽表,即每个表包含着大量的列
  • 查询相对较少(通常每台服务器每秒查询数百次或更少)
  • 对于简单查询,允许延迟大约50毫秒
  • 列中的数据相对较小:数字和短字符串(例如,每个URL 60个字节)
  • 处理单个查询时需要高吞吐量(每台服务器每秒可达数十亿行)
  • 事务不是必须的
  • 对数据一致性要求低
  • 每个查询有一个大表。除了他以外,其他的都很小。
  • 查询结果明显小于源数据。换句话说,数据经过过滤或聚合,因此结果适合于单个服务器的RAM中

很容易可以看出,OLAP场景与其他通常业务场景(例如,OLTP或K/V)有很大的不同, 因此想要使用OLTP或Key-Value数据库去高效的处理分析查询场景,并不是非常完美的适用方案。例如,使用OLAP数据库去处理分析请求通常要优于使用MongoDB或Redis去处理分析请求。

列式数据库更适合OLAP场景的原因

列式数据库更适合于OLAP场景(对于大多数查询而言,处理速度至少提高了100倍),下面详细解释了原因(通过图片更有利于直观理解):

行式

在这里插入图片描述

列式
在这里插入图片描述

看到差别了么?下面将详细介绍为什么会发生这种情况。

输入/输出

  1. 针对分析类查询,通常只需要读取表的一小部分列。在列式数据库中你可以只读取你需要的数据。例如,如果只需要读取100列中的5列,这将帮助你最少减少20倍的I/O消耗。
  2. 由于数据总是打包成批量读取的,所以压缩是非常容易的。同时数据按列分别存储这也更容易压缩。这进一步降低了I/O的体积。
  3. 由于I/O的降低,这将帮助更多的数据被系统缓存。

例如,查询«统计每个广告平台的记录数量»需要读取«广告平台ID»这一列,它在未压缩的情况下需要1个字节进行存储。如果大部分流量不是来自广告平台,那么这一列至少可以以十倍的压缩率被压缩。当采用快速压缩算法,它的解压速度最少在十亿字节(未压缩数据)每秒。换句话说,这个查询可以在单个服务器上以每秒大约几十亿行的速度进行处理。这实际上是当前实现的速度。

CPU

由于执行一个查询需要处理大量的行,因此在整个向量上执行所有操作将比在每一行上执行所有操作更加高效。同时这将有助于实现一个几乎没有调用成本的查询引擎。如果你不这样做,使用任何一个机械硬盘,查询引擎都不可避免的停止CPU进行等待。所以,在数据按列存储并且按列执行是很有意义的。

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

  1. 向量引擎:所有的操作都是为向量而不是为单个值编写的。这意味着多个操作之间的不再需要频繁的调用,并且调用的成本基本可以忽略不计。操作代码包含一个优化的内部循环。
  2. 代码生成:生成一段代码,包含查询中的所有操作。

这是不应该在一个通用数据库中实现的,因为这在运行简单查询时是没有意义的。但是也有例外,例如,MemSQL使用代码生成来减少处理SQL查询的延迟(只是为了比较,分析型数据库通常需要优化的是吞吐而不是延迟)。

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

1.1 ClickHouse的定义与发展历程

ClickHouse是一个开源的列式数据库管理系统(DBMS)用于在线分析处理(OLAP)。 它能够使用SQL查询实时生成分析数据报告。ClickHouse能够以极高的速度处理多达数十亿甚至数万亿行的数据。这是因为ClickHouse是一个列式数据库,它按列存储数据,使得数据查询变得非常高效。除了高效查询,ClickHouse还提供了高度的数据压缩,使得物理存储占用最小化。

ClickHouse由俄罗斯的互联网公司Yandex开发,Yandex是俄罗斯最大的搜索引擎和Web门户。ClickHouse最初是为了Yandex.Metrica项目开发的,这是全球第三大网页分析系统。ClickHouse于2016年被开源,并迅速在全球范围内获得了广泛的应用,被许多公司用于处理和分析大规模的数据。

1.2 ClickHouse的版本介绍

以下是ClickHouse的一些主要版本及其特性:

  • ClickHouse 1.1:这是首个公开发布的版本,主要特性包括列式存储、SQL查询、数据压缩等基础功能。

  • ClickHouse 1.2:增加了实时数据插入和查询的功能。

  • ClickHouse 1.3:优化了查询性能,可以更快地处理复杂查询。

  • ClickHouse 20.1:新增了数据复制和分布式查询的优化功能。

  • ClickHouse 20.3:提升了在大规模并行查询处理上的性能。

  • ClickHouse 21.1:优化了数据存储和查询性能,增加了对SQL标准的支持。

  • ClickHouse 21.3:最新稳定版本,优化了查询速度,增强了对高并发查询的处理能力。

以上版本中,每一次新版本的发布都包含了新功能的添加和对旧功能的优化,展现了ClickHouse快速发展和不断进步的历程。

二、ClickHouse的主要特性

在这里插入图片描述

2.1 高性能的列式存储

Clickhouse是一个列式数据库,这意味着它按列存储数据,而不是按行。例如,如果您有一个包含用户ID,用户名和密码的表,ClickHouse将分别存储用户ID,用户名和密码。当你查询特定的用户名时,只有用户名的列被加载和扫描,而不是整个表。这大大提高了查询性能,因为只有相关的数据被处理。

2.2 实时的分析查询

ClickHouse由于其优化的查询执行引擎和列式存储特性,使其能够在几秒钟内处理大量数据并生成报告。例如,如果你正在运行一个电子商务网站,并希望了解在过去的一小时内,哪些产品被查看次数最多,ClickHouse可以迅速返回结果。

2.3 高度可扩展性

如果你的业务正在快速增长,ClickHouse的高度可扩展性能够应对这种情况。例如,如果你最初在一台服务器上运行ClickHouse,但随着数据量的增加,你可以轻松地添加更多的服务器到你的ClickHouse集群,而不会影响到你现有的查询和报告。

2.4 数据压缩

ClickHouse在存储数据时会对数据进行压缩。例如,如果你的表有一列是日期,这列数据有很多重复的日期值,那么ClickHouse会使用数据压缩技术,如LZ4或ZSTD,将这些重复值压缩,从而节省存储空间,并提高查询性能。

2.5 SQL支持

尽管ClickHouse是一个列式数据库,但它支持SQL查询语言,包括SELECT,INSERT,UPDATE和DELETE语句。例如,你可以用如下SQL语句查询在过去一小时内被查看次数最多的产品:

SELECT product_id, COUNT(*) as view_count 
FROM product_views 
WHERE view_time > now() - INTERVAL 1 HOUR 
GROUP BY product_id 
ORDER BY view_count DESC 
LIMIT 10;

2.6 数据复制和容错

ClickHouse支持数据复制和容错,这意味着你的数据会被复制到集群中的其他服务器,确保即使某些服务器发生故障,你的数据也不会丢失。例如,如果你有3台服务器,你的数据将被复制3次,任何一台服务器的故障都不会导致数据丢失。同时,数据复制也可以提高查询性能,因为查询可以在多个副本上并行执行。

三、ClickHouse与其他数据库的对比

3.1 与传统的关系型数据库对比

对比项传统关系型数据库(如MySQL, PostgreSQL)ClickHouse
数据模型行存储,适合OLTP工作负载列存储,适合OLAP工作负载
性能对大规模数据分析可能存在性能瓶颈高性能,优化了查询执行引擎
可扩展性通常运行在单个服务器上,需要手动进行分片和复制分布式系统,自动进行分片和复制
适用场景结构化的事务性数据处理,如银行交易、订单管理大数据和实时分析场景,如日志数据分析、实时报告
SQL支持支持标准SQL,提供丰富的索引类型和事务支持支持SQL,但不支持事务和一些复杂的SQL特性
数据压缩通常不会进行数据压缩,占用存储空间大会对数据进行压缩,节省存储空间和提高查询性能

3.1.1 数据模型

  • 传统的关系型数据库如MySQL和PostgreSQL通常使用行存储数据。这种方式在处理事务性的OLTP(在线事务处理)工作负载时表现得很好,因为这些工作负载往往只涉及到表中的一小部分行。

  • ClickHouse则采用列存储方式,适用于OLAP(在线分析处理)工作负载,这种工作负载通常涉及到对大量行的聚合和分析。列存储的优势在于只需读取需要的列,可以大大降低I/O负载,提高查询性能。

3.1.2 性能

  • 传统关系型数据库在处理大规模数据分析任务时可能会遇到性能瓶颈。例如,对数亿条记录进行分组和聚合的查询可能需要花费很长时间。

  • ClickHouse的查询执行引擎高度优化,能够利用现代多核和矢量处理硬件,查询性能非常高。它能够在几秒钟内处理和分析大量数据。

3.1.3 可扩展性

  • 传统关系型数据库通常在单个服务器上运行,虽然有一些关系型数据库提供了分片和复制的功能,但这通常需要手动配置,而且在扩展性和复杂性之间需要进行权衡。

  • ClickHouse设计为分布式系统,提供了自动分片和复制的功能。它可以轻松地通过添加更多的服务器来扩展处理能力和存储容量。

3.1.4 适用场景

  • 传统关系型数据库适合处理结构化的事务性数据,例如银行交易、订单管理等应用。

  • ClickHouse则更适合大数据和实时分析场景,例如日志数据分析、实时报告、时间序列数据分析等。

3.1.5 SQL支持

  • 传统关系型数据库通常支持标准SQL,并提供了丰富的索引类型和事务支持。但在大规模数据分析任务中,可能需要使用复杂的SQL和索引优化来提高性能。

  • ClickHouse也支持SQL,但不支持事务和一些复杂的SQL特性。然而,它可以执行复杂的分析查询,如多维度聚合、窗口函数等,而无需索引优化。

3.1.6 数据压缩

  • 传统关系型数据库通常不会对数据进行压缩,占用的存储空间较大。

  • ClickHouse会对数据进行压缩,以节省存储空间,同时也能提高查询性能。

3.2 与其他的列式数据库对比

这些列式数据库具有不同的特点和适用场景。ClickHouse在大规模数据处理和实时分析方面表现出色,而Apache Cassandra适用于分布式数据存储和高吞吐量写入。Apache Druid专注于实时OLAP查询,而Vertica则提供高性能的大规模数据处理和复杂查询。选择适合的列式数据库取决于具体的需求和应用场景。

特性ClickHouseApache CassandraApache DruidVertica
存储模型列式存储列式存储列式存储列式存储
查询性能高性能,适用于大规模数据和复杂查询高性能,适用于大规模数据和分布式查询高性能,适用于实时OLAP查询高性能,适用于大规模数据和复杂查询
压缩率高压缩率,节省存储空间较低压缩率可选的压缩算法,节省存储空间中等压缩率
可扩展性高度可扩展,支持水平扩展和分布式架构高度可扩展,支持分布式架构高度可扩展,支持分布式架构高度可扩展,支持分布式架构
数据复制和容错支持数据复制和故障转移,提供高可用性支持数据复制和故障转移,提供高可用性支持数据复制和故障转移,提供高可用性支持数据复制和故障转移,提供高可用性
查询语言完全支持标准SQL语法,包括高级功能CQL (Cassandra Query Language)SQL-like语法完全支持标准SQL语法
数据类型支持各种数据类型,包括时间序列和数组支持常见的数据类型支持常见的数据类型支持常见的数据类型
实时分析支持实时分析查询,低延迟响应不适合实时分析,更适合高吞吐量的写入适合实时OLAP查询,低延迟响应支持实时分析查询,低延迟响应
数据一致性强一致性,数据更新即时可见最终一致性,需要时间同步最终一致性,需要时间同步强一致性,数据更新即时可见
开源项目

四、ClickHouse的应用场景

4.1 大数据实时分析

ClickHouse是一个高性能的列式数据库,它的列式存储结构使得它非常适合大数据实时分析。在此应用场景中,大量的结构化数据(例如,用户行为数据、交易数据等)被实时地写入到ClickHouse中,然后使用SQL语句快速地进行分析查询。比如,电商公司可能需要实时分析用户的购买行为,以便于动态调整它们的销售策略。

4.2 日志分析系统

日志分析是ClickHouse的一个重要应用场景。许多公司都有大量的系统日志和应用日志需要处理。 ClickHouse可以接收和存储这些日志数据,并提供SQL接口进行查询分析,如分析系统故障的原因、用户的访问行为等。例如,一个网络安全公司可能使用ClickHouse来收集和分析他们的防火墙日志,以便于快速发现并应对网络攻击。

4.3 时序数据存储

时序数据是指随时间变化而变化的数据,例如股票价格、温度读数等。ClickHouse的列式存储结构使得它非常适合存储和查询时序数据。在此应用场景中,ClickHouse不仅可以用于存储大量的时序数据,还可以提供高效的数据查询和分析。比如,一个金融公司可能使用ClickHouse来存储和分析他们的股票交易数据,以便于快速发现市场趋势和交易机会。

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

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

相关文章

C语言——通讯录管理系统

通讯录管理系统项目简介 功能说明 控制台黑窗口实现程序需要满足以下几个功能 程序开始运行时首先显示选择菜单界面,根据用户输入确定实现何种功能 程序界面 代码实现 多文件实现 和之前写的实战项目类似,这里同样采用多文件实现的方式 多文件写代码…

各种电机驱动原理

步进电机 步进电机参考资料 野火官方文档 步进电机驱动原理 上面参考文档中有的内容就不写了,写一下我自己的总结吧。 说明: 电机驱动器输入信号有电机转动方向信号DIR,电机转速信号PWM,电机使能信号EN;电机驱动器…

S7-1200PLC和LED电子看板通信(TCP/IP)

S7-200SMART PLC和LED电子看板通信应用,请查看下面文章链接: SMART 200 PLC UDP通讯应用LED看板_RXXW_Dor的博客-CSDN博客开放式用户通信 (OUC) 库:数据解析:https://rxxw-control.blog.csdn.net/article/details/121424897这篇博客我们主要介绍S7-1200PLC和LED电子看板通…

servlet 引用src目录下子目录的class文件方法

1、MyServlet class文件所处的目录结构如下&#xff1a; 2、如果在url里直接引用是不行的&#xff0c;http://localhost:9092/GetRequest_Web_exploded/MyServlet 3、需要在web.xml映射后才行&#xff1a; MyServlet com.example.MyServlet <servlet-mapping><ser…

HI_NAS linux 记录

dev/root 100% 占用解决记录 通过下面的命令查看各文件夹 大小 sudo du --max-depth1 -h # 统计当前文件夹下各个文件夹的大小显示为M 最终发现Var/log 占用很大空间 发现下面两个 log 占用空间很大&#xff0c;直接 rm-rf 即可 HI NAS python3 记录 # 安装pip3 sudo apt u…

Linux下C语言使用 netlink sockets与内核模块通信

netlink简介 Netlink套接字是用以实现用户进程与内核进程通信的一种特殊的进程间通信(IPC) ,也是网络应用程序与内核通信的最常用的接口。在Linux标准内核中&#xff0c;系统默认集成了很多netlink实例&#xff0c;比如日志上报、路由系统等&#xff0c;netlink消息是双向的&a…

【golang】调度系列之P

调度系列 调度系列之goroutine 调度系列之m 在前面两篇中&#xff0c;分别介绍了G和M&#xff0c;当然介绍的不够全面&#xff08;在写后面的文章时我也在不断地完善前面的文章&#xff0c;后面可能也会有更加汇总的文章来统筹介绍GMP&#xff09;。但是&#xff0c;抛开技术细…

移动端APP测试-如何指定测试策略、测试标准?

制定项目的测试策略是一个重要的步骤&#xff0c;可以帮助测试团队明确测试目标、测试范围、测试方法、测试资源、测试风险等&#xff0c;从而提高测试效率和质量。本篇是一些经验总结&#xff0c;理论分享。并不是绝对正确的&#xff0c;也欢迎大家一起讨论。 文章目录 一、测…

使用Linkerd实现流量管理:学习如何使用Linkerd的路由规则来实现流量的动态控制

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

Mac 错误zsh: command not found: brew解决方法

打开iterm或其他shell终端&#xff0c;执行命令&#xff1a; /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" 选择下载brew的源&#xff0c;输入1~6任意都行 根据提示输入Y及开机密码 最后执行&#xff1a;source ~/.z…

什么是鉴权?一篇文章带你了解postman的多种方式

一、什么是鉴权&#xff1f; 鉴权也就是身份认证&#xff0c;就是验证您是否有权限从服务器访问或操作相关数据。发送请求时&#xff0c;通常必须包含相应的检验参数以确保请求具有访问权限并返回所需数据。通俗的讲就是一个门禁&#xff0c;您想要进入室内&#xff0c;必须通过…

一个Qt鼠标透传场景与事件过滤器的用法

一个Qt鼠标透传场景与事件过滤器的用法 最近工作中遇到一个开发场景&#xff0c;将一个QWidget控件&#xff08;称为控件A&#xff09;放入QScrollArea&#xff0c;该控件A重写了QWidget::wheelEvent&#xff0c;根据鼠标滚轮事件缩放内部的绘制视图。当控件过大时&#xff0c…

【Redis】深入探索 Redis 主从结构的创建、配置及其底层原理

文章目录 前言一、对 Redis 主从结构的认识1.1 什么是主从结构1.2 主从结构解决的问题 二、主从结构创建2.1 配置并建立从节点2.2.1 从节点配置文件2.2.2 启动并连接 Redis 主从节点2.2.3 SLAVEOF 命令2.2.4 断开主从关系 2.2 查看主从节点的信息2.2.1 INFO REPLICATION 命令2.…

(leetcode)单值二叉树

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 目录 题目&#xff1a; 思路&#xff1a; 代码&#xff1a; 画图与分析&#xff1a; 题目&#xff1a; 如果二叉树每个节点都具有相同的值&#xff0c;那么该二叉树就是单值二叉树。 只有给定的树是单值二叉树时&…

【第四阶段】kotlin语言的构造函数学习

1.主构造函数 package Kotlin.Stage4 //主构造函数&#xff0c;规范来说&#xff0c;都是增加_xxx的形式&#xff0c;临时的输入类型&#xff0c;不能直接用。需要接收下来&#xff0c;成为变量才能用。 class TestBase(_name:String,_sex:Char,_age:Int,_info:String){ //主…

深入理解算法的时间复杂度

文章目录 时间复杂度的定义时间复杂度的分类时间复杂度分析常见数据结构和算法的时间复杂度常见数据结构常见算法 常见排序算法说明冒泡排序(Bubble Sort)快速排序(Quick Sort)归并排序(Merge Sort)堆排序(Heap Sort) 时间复杂度的定义 时间复杂度就是一种用来描述算法在输入规…

9_19,洛谷刷题记录

要做一株小草&#xff0c;默默努力 求细胞数量 #include<iostream> using namespace std; //对每个点进行搜索&#xff0c;dfs/bfs&#xff0c;将搜过的点标记出来&#xff0c;然后记录次数 //搜索几次&#xff0c;就有几个细胞 const int N110; int g[N][N],st[N][N]; …

平均精度(AP)

什么是平均精度(AP) 平均精度 (AP)并不是精度 (P)的平均值。 平均精度 (AP) 是按类别计算的。 mAP&#xff08;mean average precision&#xff09;是一个平均值&#xff0c;常用作目标检测中的检测精度指标mAP 指标通过对于一个平均目标来检测任务中多个目标所对应不同 AP&a…

linux中的开发工具

在刚开始使用linux的时候&#xff0c;我们需要在系统上写一些简单的代码&#xff0c;来熟悉环境以及各种指令 并且熟悉属于linux的一套开发的环境&#xff0c;而这对于c来说需要三个软件就可以进行简单的编码 和使用&#xff0c;让我们来认识一下下列工具&#xff0c;以及工具的…

【链表】反转链表 II-力扣 92 题

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…