大数据clickhouse篇--clickhouse从入门到精通

ClickHouse 入门篇

ClickHouse入门

  • ClickHouse 是由俄罗斯的 Yandex 开源的一个用于联机分析 OLAP 的列式存储数据库管理系统,使用 C++ 语言编写,支持SQL 实时查询的大型数据管理系统。由于 ClickHouse 在大型数据集查询处理的高效表现,从 2016年开源以来,就吸引了全球的目光,甚至一度登上 github 的关注度头把交椅。

  • OLAP:ClickHouse 的设计定位就是用于 OLAP 离线数据处理,相比于 OLTP 在线事务处理,ClickHouse更关注对海量数据的计算分析,关注的是数据吞吐、查询速度、计算性能能指标。而对于数据频繁的修改变更,则不太擅长。所以 ClickHouse通常用来构建后端的实时数仓或者离线数仓。

1. ClickHouse 的特点

列式存储

  • ClickHouse 是一个真正意义上的列式存储数据库,传统数据库存储数据都是按照数据行进行存储。比如,常用的 MySQL,使用 B+树的叶子节点完整保留一行数据。

大数据clickhouse篇--clickhouse从入门到精通_第1张图片

  • 行式存储好处是,当想要查询一条数据时,可以通过一次磁盘查找+顺序读获取得到一条完整的数据。
  • 而 ClickHouse 存储数据的方式是按列来存储,将来自不同的数据进行单独存储,每一列为一个文件进行存储。

大数据clickhouse篇--clickhouse从入门到精通_第2张图片
列式存储的好处:

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

大数据clickhouse篇--clickhouse从入门到精通_第3张图片
大数据clickhouse篇--clickhouse从入门到精通_第4张图片
DBMS的功能

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

多样化引擎

  • ClickHouse 和 MySQL
    类似,把表级的存储引擎插件化,根据表的不同需求可以设定不同的存储引擎,包括合并树、日志、接口和其它四大类 20 多种引擎。

高吞吐写入能力

  • ClickHouse 采用类 LSM Tree 的结构,数据写入后定期在后台 Compation。通过类 LSM Tree的结构,ClickHouse 在数据导入时全部都是顺序 append 写,写入后数据段不可更改,在后台 compation 时也是多个段merge sort 后顺序协会磁盘。顺序写的特性,充分利用了磁盘的吞吐能力,即便在 HDD 上也有着优异的写入性能。
  • 官方公开 benchmark 测试显示能够达到 50MB-200MB/s 的写入吞吐能力,按照每行 100Byte 估算,大约相当于50W-200W 条/s 的写入速度

数据分区与线程级并行

  • ClickHouse 将数据划分为多个 partition,每个 partition 再进一步划分为多个 indexgranularity(索引粒度),然后通过多个 CPU核心分别处理其中的一部分来实现并行数据处理。在这种设计下,单条Query就能利用整机所有CPU。极致的并行处理能力,极大的降低了查询延迟
  • 所以,ClickHouse 即使对于大量数据的查询也能够化整为零并行处理。但是有一个弊端就是对于单条查询使用多 CPU,就不利于同时并发多条查询。所以对于高 QPS 的查询业务,ClickHouse 并不是强项。
  1. 性能对比
    单表查询
    大数据clickhouse篇--clickhouse从入门到精通_第5张图片
    关联查询
    大数据clickhouse篇--clickhouse从入门到精通_第6张图片
    ClickHouse 像很多 OLAP 数据库一样,单表查询速度优于关联查询,而且 ClickHouse 的两种差距更为明显。

数据类型

  • 官方参考文档:https://clickhouse.com/docs/zh/sql-reference/data-types/

1.整型
固定长度的整型,包括有符号整型或无符号整型,数值范围:[-2n-1,2n-1-1]
大数据clickhouse篇--clickhouse从入门到精通_第7张图片
适用场景:个数、数量、存储型 id。

2.浮点型

  • Float32 —— float、Float64 —— double
  • 建议尽可能以整型形式存储数据。例如:将固定精度的数字转化为整数值,时间用毫秒为单位表示,因为浮点型进行计算时可能引起四舍五入的误差。
    大数据clickhouse篇--clickhouse从入门到精通_第8张图片
  • 适用场景:一般数据值比较小,不涉及大量的统计计算,精度要求不高的时候。 比如:保存商品的重量。

3.布尔型

  • 没有单独的类型来存储布尔值。可以使用 UInt8 类型,取值限制为 0 或 1。

4.Decimal型

  • 有符号的浮点数,可在加、减和乘法运算过程中保持精度。对于除法,最低有效数字会被丢弃(不舍入)。

  • 有三种声明:s 标识小数位
    Decimal32(s):相当于 Decimal(9-s,s),有效位数为 1~9
    Decimal64(s):相当于 Decimal(18-s,s),有效位数为 1~18
    Decimal128(s):相当于 Decimal(38-s,s),有效位数为 1~38

  • 适用场景:金额、汇率、利率等字段为了保证小数点精度,都使用 Decimal 进行存储。

  • 字符型

  • String:字符串可以任意长度的。它可以包含任意的字节集,包含空字节。

  • FixedString(N):固定长度 N 的字符串,N 必须是严格的正自然数。当服务端读取长度小于 N
    的字符串时候,通过在字符串末尾添加空字节来达到 N 字节长度。 当服务端读取长度大于 N 的字符串时候,将返回错误消息。

与 String 相比,极少会使用 FixedString,因为使用起来不是很方便。

  • 适用场景:名称、文字描述、字符型编码。固定长度的可以保存一些定长的内容,比如一些编码、性别等,但是考虑到一定的变化风险,带来收益不够明显,所以定长字符串使用意义有限。
  1. 枚举类型

文章引用来源:https://blog.csdn.net/yangwei234/article/details/124111943
目的:拜读各方大佬博客,汇总文章方便个人学习

你可能感兴趣的:(大数据,大数据,clickhouse,数据库)