【数据库学习】ClickHouse(ck)

2024-01-12 10:36
文章标签 学习 数据库 clickhouse ck

本文主要是介绍【数据库学习】ClickHouse(ck),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1,ClickHouse(CK)

是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS)。

1)特性

  1. 按列存储,列越多速度越慢;
    按列存储,数据更容易压缩(类型相同、区分度);==》每次读取的数据就更多,更少的io。
  2. 聚合性能高;
  3. 类sql操作;仅支持数据的查询、批量写入、批量删除。
  4. 用于磁盘查询,同时也利用SSD和内存
  5. 支持近似计算

2)常见的列式数据库有

Vertica、 Paraccel (Actian Matrix,Amazon Redshift)、 Sybase IQ、 Exasol、 Infobright、 InfiniDB、 MonetDB (VectorWise, Actian Vector)、 LucidDB、 SAP HANA、 Google Dremel、 Google PowerDrill、 Druid、 kdb+。

3)ck为什么快?

  1. 列式存储,数据类型相同,值范围也可能小(稀疏索引),更容易压缩,压缩之后每次io读取数据更多,降低了io。
  2. 可以把更多的数据放入内存。
  3. 在ck中,数据保存在不同的shard上,每一个shard都由一组用于容错的replica组成,查询可以并行地在所有shard上进行处理。
  4. 向量引擎,更高效的使用cpu。

2,索引原理

1)主索引(Primary Indexes)建立:LSM树

  1. 数据批量入库;
  2. 索引文件组织:主键列 + 其它排序列 升序
    每个表都有一个数据文件(*.bin)用于存储索引
  3. 按稀疏矩阵压缩,存储在磁盘上。

Granule (颗粒、行组)
是ck进行数据处理的最小的不可分割数据集。
ck每次读取数据,不是读取单独的行,而是始终读取整个行组(Granule)。

在这里插入图片描述第一个(根据磁盘上的物理顺序)8192行(它们的列值)在逻辑上属于颗粒0,然后下一个8192行(它们的列值)属于颗粒1,以此类推。
每个颗粒对应主索引的一个条目。

2)索引查询

1>颗粒选择

通过主索引二分查找,选择可能包含匹配查询的行的颗粒。

2>定位颗粒

每个列的标记文件以偏移量的形式存储两个位置:

  1. 压缩块位置
    包含所选颗粒的压缩版本的压缩列数据文件中定位块。这个压缩块可能包含几个压缩的颗粒。所定位的压缩文件块在读取时被解压到内存中。
  2. 解压数据的位置
    颗粒在解压数据块中的位置。

3)二级索引(Skipping Indexes)

传统的关系数据库的二级索引并不适用与ck(或者列式存储数据库),因为磁盘上没有单独的行可以添加到索引中。

如果一级索引查询后基数过大,可以考虑建立二级索引;
如果二级索引没有太大作用,此时,可以考虑:

  1. 新建一个不同的主键的新表;
  2. 创建一个物化视图;
  3. 增加Projecttion

ck主要的二级索引类型有:minmax、set、Bloom Filter。

1>Minmax

存储每个块的索引表达式的最小值和最大值(如果表达式是一个元组,它分别存储元组元素的每个成员的值)。

场景:标量、元组表达式
不适用于:数组、map数据类型

2>Set

这个集合包含块中的所有值。
场景:列值相对集中。每组颗粒中基数较低、但总体基数较高的列。

3>Bloom Filter Types(跳数索引)

允许对集合成员进行高效的是否存在测试,但代价是有轻微的误报,读取更多的块。
场景:列有较多离散值、主键和目标列具有很强的相关性。

4)MergeTree引擎

这篇关于【数据库学习】ClickHouse(ck)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/597591

相关文章

SQL Server修改数据库名及物理数据文件名操作步骤

《SQLServer修改数据库名及物理数据文件名操作步骤》在SQLServer中重命名数据库是一个常见的操作,但需要确保用户具有足够的权限来执行此操作,:本文主要介绍SQLServer修改数据... 目录一、背景介绍二、操作步骤2.1 设置为单用户模式(断开连接)2.2 修改数据库名称2.3 查找逻辑文件名

SQL Server数据库死锁处理超详细攻略

《SQLServer数据库死锁处理超详细攻略》SQLServer作为主流数据库管理系统,在高并发场景下可能面临死锁问题,影响系统性能和稳定性,这篇文章主要给大家介绍了关于SQLServer数据库死... 目录一、引言二、查询 Sqlserver 中造成死锁的 SPID三、用内置函数查询执行信息1. sp_w

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

Druid连接池实现自定义数据库密码加解密功能

《Druid连接池实现自定义数据库密码加解密功能》在现代应用开发中,数据安全是至关重要的,本文将介绍如何在​​Druid​​连接池中实现自定义的数据库密码加解密功能,有需要的小伙伴可以参考一下... 目录1. 环境准备2. 密码加密算法的选择3. 自定义 ​​DruidDataSource​​ 的密码解密3

Maven项目中集成数据库文档生成工具的操作步骤

《Maven项目中集成数据库文档生成工具的操作步骤》在Maven项目中,可以通过集成数据库文档生成工具来自动生成数据库文档,本文为大家整理了使用screw-maven-plugin(推荐)的完... 目录1. 添加插件配置到 pom.XML2. 配置数据库信息3. 执行生成命令4. 高级配置选项5. 注意事

在Java中基于Geotools对PostGIS数据库的空间查询实践教程

《在Java中基于Geotools对PostGIS数据库的空间查询实践教程》本文将深入探讨这一实践,从连接配置到复杂空间查询操作,包括点查询、区域范围查询以及空间关系判断等,全方位展示如何在Java环... 目录前言一、相关技术背景介绍1、评价对象AOI2、数据处理流程二、对AOI空间范围查询实践1、空间查

Python+PyQt5实现MySQL数据库备份神器

《Python+PyQt5实现MySQL数据库备份神器》在数据库管理工作中,定期备份是确保数据安全的重要措施,本文将介绍如何使用Python+PyQt5开发一个高颜值,多功能的MySQL数据库备份工具... 目录概述功能特性核心功能矩阵特色功能界面展示主界面设计动态效果演示使用教程环境准备操作流程代码深度解

MybatisPlus3.3.1整合clickhouse的过程

《MybatisPlus3.3.1整合clickhouse的过程》:本文主要介绍MybatisPlus3.3.1整合clickhouse的过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定... 前言ClickHouse是俄罗斯Yandex发布的一款数据分析型数据库支持sql语法,详情可以访问官网,

MySQL数据库实现批量表分区完整示例

《MySQL数据库实现批量表分区完整示例》通俗地讲表分区是将一大表,根据条件分割成若干个小表,:本文主要介绍MySQL数据库实现批量表分区的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考... 目录一、表分区条件二、常规表和分区表的区别三、表分区的创建四、将既有表转换分区表脚本五、批量转换表为分区