ClickHouse笔记

1. 简介

  • 开发背景: ClickHouse 由 Yandex 于 2016 年开源,目的是提供高性能的 OLAP 解决方案。
  • 性能: ClickHouse 能够以极高的速度处理大量数据,每秒可以处理数亿到十亿多行数据。
  • 架构: 它使用 C++ 编写,提供丰富的数据类型、数据库引擎和表引擎,支持多种数据压缩方式。
  • 存储: 数据以列式存储,优化了读取部分列时的 I/O 效率,同时便于数据压缩。
  • SQL 支持: ClickHouse 支持类似 SQL 的查询语言,允许实时生成分析数据报告。
  • 特性: 支持数据分区、多核并行处理、索引、在线查询、近似计算等。
  • 应用场景: 适用于大数据分析、数据仓库、BI 报表、监控系统等场景。

2. 基本概念

2.1 数据类型

2.2 数据库引擎

2.2.1 Ordinary

默认引擎,在绝大多数情况下我们都会使用默认引 擎,使用时无须刻意声明。在此数据库下可以使用任意类型的表引 擎。

2.2.2 Dictionary

字典引擎,此类数据库会自动为所有数据字典创 建它们的数据表。

2.2.3 Memory

内存引擎,用于存放临时数据。此类数据库下的数据 表只会停留在内存中,不会涉及任何磁盘操作,当服务重启后数据会 被清除。

2.2.4 Lazy

日志引擎,此类数据库下只能使用Log系列的表引擎,关 于Log表引擎的详细介绍会在第8章展开。

2.2.5 MySQL

MySQL引擎,此类数据库下会自动拉取远端MySQL中的数 据,并为它们创建MySQL表引擎的数据表。

2.3 表引擎

2.4 压缩算法

  • 列式存储:重复的数据越多,压缩比例就越好。

3. 实践应用

3.1 clickhouse 集群

ClickHouse 服务通过 Paxos 协议管理整个集群的状态,无需繁重的集群管理操作,自动管理各节点。与Hadoop生态的其他数 据库相比,ClickHouse更像一款“传统”MPP架构的数据库,它没有采 用Hadoop生态中常用的主从架构,而是使用了多主对等网络结构

3.2 数据同步和导入

4. 性能优化

4.1 索引

4.2 分片

数据分片是将数据进行横向切分,这是一种在面对海量数据的场 景下,解决存储和查询瓶颈的有效手段,是一种分治思想的体现。 ClickHouse支持分片,而分片则依赖集群。每个集群由1到多个分片组 成,而每个分片则对应了ClickHouse的1个服务节点。分片的数量上限 取决于节点数量(1个分片只能对应1个服务节点)。

4.3 分区

数据分区(partition)和数据分片(shard)是完全不同的两个 概念。数据分区是针对本地数据而言的,是数据的一种纵向切分。而 数据分片是数据的一种横向切分。

5. 常见问题解答

5.1 ClickHouse为什么快?

很多用户心中一直会有这样的疑问,为什么ClickHouse这么快? 前面的介绍对这个问题已经做出了科学合理的解释。比方说,因为 ClickHouse是列式存储数据库,所以快;也因为ClickHouse使用了向量化引擎,所以快。这些解释都站得住脚,但是依然不能消除全部的 疑问。因为这些技术并不是秘密,世面上有很多数据库同样使用了这 些技术,但是依然没有ClickHouse这么快。所以我想从另外一个角度 来探讨一番ClickHouse的秘诀到底是什么。

5.2 ClickHouse为什么不使用B+树?

ClickHouse 是一款列式存储数据库,它的设计和数据存储结构与基于 B+ 树的数据库系统有着本质的不同。以下是 ClickHouse 不使用 B+ 树的几个原因:

  1. 列式存储的优势: ClickHouse 采用列式存储,这意味着数据是按列而不是按行存储的。这种方式对于 OLAP(在线分析处理)场景非常有效,因为它允许数据库只读取查询中需要的列,从而减少了 I/O 操作和提高了查询效率。相比之下,B+ 树是一种基于行的数据结构,适合于 OLTP(在线事务处理)场景,其中行的完整性和事务操作更为重要。

  2. 数据压缩: 列式存储天然适合数据压缩,因为同一列中的数据类型相同,可以应用更高效的压缩算法。ClickHouse 利用这一特性,通过压缩同一列的数据来减少存储空间和提高 I/O 效率。而 B+ 树结构通常不支持列压缩,因为它是为行级存储设计的。

  3. 高性能的聚合操作: ClickHouse 专为快速的数据分析和聚合操作而设计,列式存储使得这些操作更加高效,因为相关的列可以被快速加载和处理。B+ 树则更适合于执行基于主键的快速查找和更新操作。

  4. 数据分区和分片: ClickHouse 支持数据的自动分区和分片,这有助于管理大规模数据集并提高查询性能。B+ 树虽然也可以在数据库中实现分区,但它本身并不直接支持这一功能,通常需要数据库系统层面的支持。

  5. 数据合并和更新策略: ClickHouse 的 MergeTree 引擎支持数据的后台合并和净化操作,这有助于保持数据的整洁和高效查询。B+ 树则需要更复杂的操作来维护数据的一致性和性能。

  6. 数据加载和查询模式: ClickHouse 设计用于处理大量数据的批量加载和复杂查询,其数据加载和查询模式与 B+ 树索引的行级操作不同。

总的来说,ClickHouse 的设计目标是为了优化分析型工作负载,特别是那些涉及大量数据和复杂查询的场景。而 B+ 树更适合于事务型工作负载,其中数据的一致性和行级操作更为关键。因此,ClickHouse 选择了列式存储和专门的表引擎,如 MergeTree,来满足其性能和效率的要求,而不是使用 B+ 树这种传统的索引结构。

6. 原理解读

6.1 LSM树

LSM树也是一种非常流行的索引结构,发源于Google的BigTable,现在最具代表性的使用LSM树索引结构的系统是HBase。LSM本 质上可以看作将原本的一棵大树拆成了许多棵小树,每一批次写入的 数据都会经历如下过程。首先,会在内存中构建出一棵小树,构建完毕即算写入成功(这里会通过预写日志的形式,防止因内存故障而导 致的数据丢失)。写入动作只发生在内存中,不涉及磁盘操作,所以极大地提升了数据写入性能。其次,小树在构建的过程中会进行排 序,这样就保证了数据的有序性。最后,当内存中小树的数量达到某 个阈值时,就会借助后台线程将小树刷入磁盘并生成一个小的数据 段。在每个数据段中,数据局部有序。也正因为数据有序,所以能够 进一步使用稀疏索引来优化查询性能。

7. 总结

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

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

相关文章

深度学习方法;乳腺癌分类

乳腺癌的类型很多,但大多数常见的是浸润性导管癌、导管原位癌和浸润性小叶癌。浸润性导管癌(IDC)是最常见的乳腺癌类型。这些都是恶性肿瘤的亚型。大约80%的乳腺癌是浸润性导管癌(IDC),它起源于乳腺的乳管。 浸润性是指癌症已经“侵袭”或扩散到周围的乳…

SSM 项目学习(Vue3+ElementPlus+Axios+SSM)

文章目录 1 项目介绍1.1 项目功能/界面 2 项目基础环境搭建2.1 创建项目2.2 项目全局配置 web.xml2.3 SpringMVC 配置2.4 配置 Spring 和 MyBatis , 并完成整合2.5 创建表,使用逆向工程生成 Bean、XxxMapper 和 XxxMapper.xml2.6 注意事项和细节说明 3 实现功能 01-…

redis进阶入门主从复制与哨兵集群

一、主从复制 1.1背景 一般来说,要将 Redis用于工程项目中,只使用一台 Redist是万万不能的,原因如下: 从结构上,单个 Redist服务器会发生单点故障,井且一台服务器需要处理所有的请求负載,压力…

软件测试(测试用例详解)(三)

1. 测试用例的概念 测试用例(Test Case)是为了实施测试而向被测试的系统提供的一组集合。 测试环境操作步骤测试数据预取结果 测试用例的评价标准: 用例表达清楚,无二义性。。用例可操作性强。用例的输入与输出明确。一条用例只有…

数据库性能优化入门:数据库分片初探

数据库分片是一种用于提升数据库性能的架构模式,选择正确的分片策略和实施方式对于提高数据库性能和应对大规模数据挑战至关重要。 本文介绍了数据库分片的定义、原理和实施方法。文章解释了数据库分片是如何通过将数据切分、分散存储在多个服务器上来提升性能&…

Linux-程序地址空间

目录 1. 程序地址空间分布 2. 两个问题 3. 虚拟地址和物理地址 4. 页表 5. 解决问题 6. 为什么要有地址空间 1. 程序地址空间分布 测试一下&#xff1a; #include<stdio.h> #include<stdlib.h> #include<unistd.h> #include<sys/types.h>int ga…

计算机服务器中了halo勒索病毒怎么办,halo勒索病毒解密流程步骤

随着网络技术的不断应用&#xff0c;企业的生产运营得到了快速发展&#xff0c;越来越多的企业开始利用服务器数据库存储企业的重要信息文件&#xff0c;数据库为企业的生产运营提供了极大便利&#xff0c;但网络技术的不断发展也为企业的数据安全带来严重威胁。近日&#xff0…

全栈的自我修养 ———— react中router入门+路由懒加载

router 下载router配置view创建目录配置index.js 下载router npm install react-router-dom配置view 如下将组件倒出 const Login () > {return <div>这是登陆</div> } export default Login创建目录 配置index.js React.lazy有路由懒加载的功能&#xff0…

redis进阶入门配置与持久化

一、Redis.conf详解 容量单位 1、配置大小单位&#xff0c;开头定义了一些基本的度量单位&#xff0c;只支持bytes&#xff0c;不支持bit,不区分大小写&#xff0c;G和GB有区别 2、对 大小写 不敏感 可以使用 include 组合多个配置问题 网络配置 bind 127.0.0.1 # 绑定的i…

递归算法讲解2

前情提要 上一篇递归算法讲解在这里 递归算法讲解&#xff08;结合内存图&#xff09; 没看过的小伙伴可以进去瞅一眼&#xff0c;谢谢&#xff01; 递归算法的重要性 递归算法是非常重要的&#xff0c;如果想要进大厂&#xff0c;以递归算法为基础的动态规划是必考的&…

【React】基于JS 3D引擎库实现关系图(图graph)

主角&#xff1a;3D Force-Directed Graph 简介&#xff1a;一个使用ThreeJS/WebGL进行3D渲染的Graph图库 GitHub: https://github.com/vasturiano/3d-force-graph Ps: 较为复杂或节点巨大时&#xff0c;对GPU>CPU消耗较大&#xff0c;同量级节点对比下优于AntV G6和Echarts…

RDD算子(四)、血缘关系、持久化

1. foreach 分布式遍历每一个元素&#xff0c;调用指定函数 val rdd sc.makeRDD(List(1, 2, 3, 4)) rdd.foreach(println) 结果是随机的&#xff0c;因为foreach是在每一个Executor端并发执行&#xff0c;所以顺序是不确定的。如果采集collect之后再调用foreach打印&#xf…

51之定时器与中断系统

目录 1.定时器与中断系统简介 1.1中断系统 1.2定时器 1.2.1定时器简介 1.2.2定时器大致原理及其配置 1.2.3定时器所需的所有配置总介 2.定时器0实现LED闪烁 3.使用软件生成定时器初始化程序 1.定时器与中断系统简介 1.1中断系统 首先&#xff0c;我们需要来了解一下什么…

Vue项目中引入html页面(vue.js中引入echarts数据大屏html [静态非数据传递!] )

在项目原有vue&#xff08;例如首页&#xff09;基础上引入html页面 1、存放位置 vue3原有public文件夹下 我这边是新建一个static文件夹 专门存放要用到的html文件 复制拖拽过来 index为html的首页 2、更改路径引入到vue中 这里用到的是 iframe 方法 不同于vue的 component…

python爬虫获取豆瓣前top250的标题(简单)

今天是简略的一篇&#xff0c;简单小实验 import requests from bs4 import BeautifulSoup# 模拟浏览器的构成&#xff08;请求头&#xff09; headers {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Ch…

从零开始搭建后端信息管理系统(新手小白比如)

如果你是新手小白&#xff0c;首先我们要进行一些准备工作&#xff0c;安装一些基础软件&#xff0c; 备注一下&#xff1a;这里安装的vue环境的后台管理系统&#xff0c;不同的后台管理系统&#xff0c;需要安装不同的插件 准备工作&#xff1a; 安装 Visual Studio Code …

如何使用 Midjourney?2024年最新更新

一&#xff1a;基础篇 1&#xff1a;注册 首先&#xff0c;你需要注册一个 Discord 账号&#xff0c;然后加入 Midjourney 的 Discord 服务器。或者去 Midjourney 的官网点击右下角的 Join the Beta&#xff1a; ​ 2&#xff1a;在 Discord 公共服务器里使用 注册并进入到…

Unix 网络编程, Socket 以及bind(), listen(), accept(), connect(), read()write()五大函数简介

Unix网络编程是针对类Unix操作系统&#xff08;包括Linux、BSD以及其他遵循POSIX标准的操作系统&#xff09;进行网络通信开发的技术领域。网络编程涉及创建和管理网络连接、交换数据以及处理不同层次网络协议栈上的各种网络事件。在Unix环境中&#xff0c;网络编程通常涉及到以…

kubectl explain资源文档命令

学习并使用了一段时间的kubernetes&#xff0c;发现对k8s还是了解甚少&#xff0c;于是利用上下班通勤的时间又去B站看一些大佬的视频&#xff0c;又来重学巩固一遍知识&#xff0c;并做些记录。 之前在学习使用过程中未成了解过explain这个命令&#xff0c;因为自己部署的版本…

【开发、测试】接口规范与测试

接口测试基础 url 是互联网标准资源地址&#xff0c;称为统一资源定位符 组成&#xff1a;协议&#xff0c;服务器地址&#xff0c;端口号 HTTP协议 HTTP&#xff1a;超文本传输协议&#xff0c;基于请求与响应的应用层协议 作用&#xff1a;规定了客户端和服务器之间的信…