Clickhouse学习
简介
- 列式存储数据库
- 用于在线分析处理查询(OLAP)
- 能够使用SQL查询实时数据
- OLAP场景特征
- 大多数是读请求
- 数据总是以相当大的批(> 1000 rows)进行写入
- 不修改已添加的数据
- 每次查询都从数据库中读取大量的行,但是同时又仅需要少量的列
- 宽表,即每个表包含着大量的列
较少的查询(通常每台服务器每秒数百个查询或更少) - 对于简单查询,允许延迟大约50毫秒
- 列中的数据相对较小: 数字和短字符串(例如,每个URL 60个字节)
- 处理单个查询时需要高吞吐量(每个服务器每秒高达数十亿行)
- 事务不是必须的
- 对数据一致性要求低
- 每一个查询除了一个大表外都很小
- 查询结果明显小于源数据,换句话说,数据被过滤或聚合后能够被盛放在单台服务器的内存中
Clickhouse特点
列式存储
优点:
- 对于列的聚合,计数,求和等统计操作原因优于行式存储。
- 由于某一列的数据类型都是相同的,针对于数据存储更容易进行数据压缩,每一列选择更优的数据压缩算法,大大提高了数据的压缩比重。
- 由于数据压缩比更好,一方面节省了磁盘空间,另一方面对于cache也有了更大的发挥空间。
DBMS功能
-
支持基于SQL的声明式查询语言,大部分情况下是与SQL标准兼容的。
-
支持的查询包括 GROUP BY,ORDER BY,IN,JOIN以及非相关子查询。
-
不支持窗口函数和相关子查询。
多样化引擎
- clickhouse和mysql类似,把表级的存储引擎插件化,根据表的不同需求可以设定不同的存储引擎,包括了合并树、日志、接口和其他四大类几十种引擎.
高吞吐写入能力
- 采用了LSM Tree结构(合并树),数据会在后台不定期进行Compaction.
- 通过类LSM tree的结构,ClickHouse在数据导入时全部是顺序append写,写入后数据段不可更改,在后台compaction时也是多个段merge sort后顺序写回磁盘。
- 又由于顺序写的缘故,充分利用了磁盘的吞吐能力,所以其有着非常好的写入性能.
数据分区和线程并行
- ClickHouse将数据划分为多个partition,每个partition再进一步划分为多个index granularity(粒度),然后通过多个CPU核心分别处理其中的一部分来实现并行数据处理。
- 在这种设计下,单条Query就能利用整机所有CPU。极致的并行处理能力,极大的降低了查询延时。
- 对于大量数据的查询能够化整为零平行处理。
- 不利于同时并发多条查询。所以对于高qps的查询业务,clickhouse并不是强项。
缺陷
- 没有完整的事务支持。
- 缺少高频率,低延迟的修改或删除已存在数据的能力。仅能用于批量删除或修改数据,但这符合 GDPR。
- 稀疏索引使得ClickHouse不适合通过其键检索单行的点查询。
数据类型
整数类型
Int Ranges
Int8 - [-128 : 127]
Int16 - [-32768 : 32767]
Int32 - [-2147483648 : 2147483647]
Int64 - [-9223372036854775808 : 9223372036854775807]
Uint Ranges
UInt8 - [0 : 255]
UInt16 - [0 : 65535]
UInt32 - [0 : 4294967295]
UInt64 - [0 : 18446744073709551615]
浮点类型
Float32 - float
Float64 - double
值得注意的是,其继承了所有编程语言的关于浮点数精度问题,所以需要尽量避免使用
Decimal类型
Decimal32(s),相当于Decimal(9-s,s)
Decimal64(s),相当于Decimal(18-s,s)
Decimal128(s),相当于Decimal(38-s,s)
Boolean类型
没有单独的类型来存储布尔值。可以使用 UInt8 类型,取值限制为 0 或 1
字符串
- String (varchar) 可以是任意长度的任意字符
- Fixedstring(N) (char(n)) 固定长度N的字符(N>0)
枚举类型
- 包括 Enum8 和 Enum16 类型。Enum 保存 'string'= integer 的对应关系。
- Enum8 用 'String'= Int8 对描述。
- Enum16 用 'String'= Int16 对描述
使用场景
- 对一些状态、类型的字段算是一种空间优化,也算是一种数据约束。但是实际使用中往往因为一些数据内容的变化增加一定的维护成本,甚至是数据丢失问题。所以谨慎使用。
时间类型
目前clickhouse只有三种时间类型
- Date 接受 年-月-****日 的字符串比如 ‘2019-12-16’
- Datetime 接受 年-月-日 时:分😗***秒 的字符串比如 ‘2019-12-16 20:50:10’
- Datetime64 接受 年-月-日 时:分:秒.****亚秒 的字符串比如 ‘2019-12-16 20:50:10.66’
数组
Array(T):由 T 类型元素组成的数组, T 可以是任意类型,包含数组类型。
创建方式
- 使用Array函数
- 使用[ ]语法
- 使用此法时,每个数据都有两个索引,正序的和逆序的(-1)
其他数据类型
看 👉 官网地址
表引擎
作用
- 数据的存储方式和位置,写到哪里以及从哪里读取数据
- 支持哪些查询以及如何支持。
- 并发数据访问。
- 索引的使用(如果存在)
- 是否可以执行多线程请求
- 数据复制参数。
使用
在建表时定义(必须)和设置参数,其对大小写敏感.
常用引擎
- TinyLog
- Memory
- MergeTree
- ReplacingMergeTree
- SummingMergeTree
关于引擎的补充说明