clickhouse
2023-03-27 15:17:24 0 举报
AI智能生成
对于clickhouse组件的重点内容总结,面试经验总结
作者其他创作
大纲/内容
优点
1、真正的面向列的DBMS(clickhouse是一个DBMS,而不是一个单一的数据库。它允许在运行时创建表和数据库、加载数据和运行查询,而无需重新配置和重新启动服务器)
2、数据压缩(一些面向列的DBMS)不使用数据压缩。但是,数据压缩确实提高了性能
3、磁盘存储的数据(许多面向列的DBMS(SPA HANA和GooglePowerDrill))只能在内存中工作,但即使在数千台服务器上,内存也太小了
4、多核并行处理(多核多节点并行化大型查询)
5、在多个服务器上分布式处理(在clickhouse中,数据可以驻留在不同的分片上。每个分片都可以用于容错的一组副本,查询会在所有分片上并行处理)
6、SQL支持(clickhouse sql跟真正的sql有不一样的函数名称。不过语法基本跟sql语法兼容,支持join/from/in和join子句及标量子查询支持子查询)
7、向量化引擎(数据不仅按列式存储,而且由矢量-列部分进行处理,这使得开发者能够实现高CPU性能)
实时数据更新(clickhouse支持主键表。为了快速执行对主键范围的查询,数据使用合并数进行递增排序。由于这个原因,数据可以不断地添加到表中)
8、支持近似计算(统计全国到底有多少人)
9、数据复制和对数据完整性的支持(clickhouse使用异步多主复制。写入任何可用的副本后。数据将分发到所有剩余的副本。系统在不同的副本上保持相同的数据,数据在失败后自动恢复)
2、数据压缩(一些面向列的DBMS)不使用数据压缩。但是,数据压缩确实提高了性能
3、磁盘存储的数据(许多面向列的DBMS(SPA HANA和GooglePowerDrill))只能在内存中工作,但即使在数千台服务器上,内存也太小了
4、多核并行处理(多核多节点并行化大型查询)
5、在多个服务器上分布式处理(在clickhouse中,数据可以驻留在不同的分片上。每个分片都可以用于容错的一组副本,查询会在所有分片上并行处理)
6、SQL支持(clickhouse sql跟真正的sql有不一样的函数名称。不过语法基本跟sql语法兼容,支持join/from/in和join子句及标量子查询支持子查询)
7、向量化引擎(数据不仅按列式存储,而且由矢量-列部分进行处理,这使得开发者能够实现高CPU性能)
实时数据更新(clickhouse支持主键表。为了快速执行对主键范围的查询,数据使用合并数进行递增排序。由于这个原因,数据可以不断地添加到表中)
8、支持近似计算(统计全国到底有多少人)
9、数据复制和对数据完整性的支持(clickhouse使用异步多主复制。写入任何可用的副本后。数据将分发到所有剩余的副本。系统在不同的副本上保持相同的数据,数据在失败后自动恢复)
缺点
1、没有完整的事务支持,不支持transaction,想快就别transaction
2、缺少完整update/delete操作,缺少高频率、低延迟的修改或删除已存在数据的能力,仅用于批量删除或修改数据
3、聚合结果必须小于一台机器的内存大小
4、支持有限操作系统,正在慢慢完善
5、不适合key-value存储,不支持blob等文档型数据库
2、缺少完整update/delete操作,缺少高频率、低延迟的修改或删除已存在数据的能力,仅用于批量删除或修改数据
3、聚合结果必须小于一台机器的内存大小
4、支持有限操作系统,正在慢慢完善
5、不适合key-value存储,不支持blob等文档型数据库
项目中常见表引擎
创建与存储
MergeTree在写入一批数据时,数据总会以数据片段的形式写入磁盘,且数据片段不可修改。
为了避免片段过多,clickhouse会通过后台线程,定期合并这些数据片段,属于相同分区的数据片段会被合成一个新的片段
这种数据片段往复合并的特点,也正是合并树的由来
为了避免片段过多,clickhouse会通过后台线程,定期合并这些数据片段,属于相同分区的数据片段会被合成一个新的片段
这种数据片段往复合并的特点,也正是合并树的由来
数据分区
MergeTree数据分区的规则由分区id决定,而具体到每个数据分区所对应的id,则是由分区键的取值决定的。
针对取值数据类型的不同,分区ID的生成逻辑目前拥有四种规则:
不指定分区键:
如果不使用分区键,即不使用PARTITION BY声明任何分区表达式,则分区ID默认取名
为all,所有的数据都会被写入这个all分区。
使用整型:
如果分区键取值属于整型(兼容UInt64,包括有符号整型和无符号整型),且无法转换
为日期类型YYYYMMDD格式
则直接按照该整型的字符形式输出,作为分区ID的取值。
使用日期类型:
如果分区键取值属于日期类型,或者是能够转换为YYYYMMDD格式的整型
则使用按照YYYYMMDD进行格式化后的字符形式输出,并作为分区ID的取值。
使用其他类型:
如果分区键取值既不属于整型,也不属于日期类型
例如String、Float等,则通过128位Hash算法取其Hash值作为分区ID的取值
针对取值数据类型的不同,分区ID的生成逻辑目前拥有四种规则:
不指定分区键:
如果不使用分区键,即不使用PARTITION BY声明任何分区表达式,则分区ID默认取名
为all,所有的数据都会被写入这个all分区。
使用整型:
如果分区键取值属于整型(兼容UInt64,包括有符号整型和无符号整型),且无法转换
为日期类型YYYYMMDD格式
则直接按照该整型的字符形式输出,作为分区ID的取值。
使用日期类型:
如果分区键取值属于日期类型,或者是能够转换为YYYYMMDD格式的整型
则使用按照YYYYMMDD进行格式化后的字符形式输出,并作为分区ID的取值。
使用其他类型:
如果分区键取值既不属于整型,也不属于日期类型
例如String、Float等,则通过128位Hash算法取其Hash值作为分区ID的取值
为什么快
列式存储
clickhouse采用列式存储,即将一个表中的每一列分别存储在不同的文件中,这样在进行数据查询时,只需要读取需要的列,而不用读取整行数据,大幅减少了I/O操作,提高了查询速度
压缩算法
clickhouse内置多种压缩算法,例如LZ4、ZSTD等,可以在不损失数据精度的情况下,大幅减少数据的存储空间,从而减少磁盘I/O操作,提高潮汛速度
分布式架构
clickhouse支持分布式部署,可以将数据分散存储在多个节点上,并行进行计算和查询,从而提高数据处理和查询的速度
索引技术
clickhouse支持多种索引技术,包括bloom过滤器、bitmap索引、range索引等,可以根据不同的查询场景选择最优的索引方式,提高查询速度
预编译技术
clickhouse支持预编译技术,即将查询语句进行编译,并将编译结果缓存起来,下次查询时可以直接使用缓存结果,避免重复编译,提高查询速度
并发量
并发查询数
clickhouse可以支持多个客户端同时连接到服务器,每个连接可以独立执行查询请求。clickhouse可以通过调整网络参数和连接池配置,优化并发连接数和网络性能
并发写入量
clickhouse可以支持大量的数据写入,并且可以进行并发写入。clickhouse可以通过分区和索引等机制,避免数据热点和写入冲突,从而提高并发写入量和写入性能
并发读取量
clickhouse可以支持大量的数据读取,并且可以进行并发读取。click house可以利用多核cpu和大量内存,进行高效的数据读取和处理,从而提高并发读取量和读取性能
索引机制
哈希索引
ClickHouse支持对单个列进行哈希索引,将列值映射到哈希表中的桶中。哈希索引适用于等值查询和IN操作,但不适用于范围查询和排序操作。
bloom过滤器
ClickHouse支持在哈希索引上使用Bloom过滤器,可以快速判断某个值是否在索引中。Bloom过滤器适用于等值查询和IN操作,可以减少不必要的磁盘I/O操作。
bitmap索引
ClickHouse支持对多个列进行Bitmap索引,将列值映射到位图中的位上。Bitmap索引适用于等值查询和IN操作,可以快速判断某个值是否在索引中。
range索引
ClickHouse支持对单个列进行Range索引,将列值按序存储在索引树中。Range索引适用于范围查询和排序操作,可以提高查询效率。
多级索引
ClickHouse支持多级索引,可以在多个列上建立索引,从而支持多条件查询和多级排序。
一级索引
ClickHouse的一级索引是指数据文件的内部索引,也叫做Primary Key索引。一级索引是在数据写入磁盘时就建立的,用于快速定位数据文件中的某一行数据。一级索引的建立是基于数据表中的主键,因此主键的选择和设计非常重要。一级索引可以有效地支持等值查询、范围查询和排序操作,是ClickHouse的核心索引机制之一。
二级索引
ClickHouse的二级索引是指在一级索引的基础上,额外建立的索引结构。二级索引可以在不改变数据表结构的情况下,对非主键列进行索引,从而支持更多的查询场景。二级索引的建立需要耗费额外的磁盘空间和内存资源,因此需要谨慎选择索引列和建立索引的数量。ClickHouse支持多种类型的二级索引,包括哈希索引、Bloom过滤器、Bitmap索引、Range索引等。
0 条评论
下一页