Clickhouse学习

简介

  • 列式存储数据库
  • 用于在线分析处理查询(OLAP)
  • 能够使用SQL查询实时数据

  • OLAP场景特征
    1. 大多数是读请求
    2. 数据总是以相当大的批(> 1000 rows)进行写入
    3. 不修改已添加的数据
    4. 每次查询都从数据库中读取大量的行,但是同时又仅需要少量的列
    5. 宽表,即每个表包含着大量的列
      较少的查询(通常每台服务器每秒数百个查询或更少)
    6. 对于简单查询,允许延迟大约50毫秒
    7. 列中的数据相对较小: 数字和短字符串(例如,每个URL 60个字节)
    8. 处理单个查询时需要高吞吐量(每个服务器每秒高达数十亿行)
    9. 事务不是必须的
    10. 对数据一致性要求低
    11. 每一个查询除了一个大表外都很小
    12. 查询结果明显小于源数据,换句话说,数据被过滤或聚合后能够被盛放在单台服务器的内存中

Clickhouse特点

列式存储

优点:

  1. 对于列的聚合,计数,求和等统计操作原因优于行式存储。
  2. 由于某一列的数据类型都是相同的,针对于数据存储更容易进行数据压缩,每一列选择更优的数据压缩算法,大大提高了数据的压缩比重。
  3. 由于数据压缩比更好,一方面节省了磁盘空间,另一方面对于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

字符串

  1. String (varchar) 可以是任意长度的任意字符
  2. Fixedstring(N) (char(n)) 固定长度N的字符(N>0)

枚举类型

  • 包括 Enum8 和 Enum16 类型。Enum 保存 'string'= integer 的对应关系。
  • Enum8 用 'String'= Int8 对描述。
  • Enum16 用 'String'= Int16 对描述

使用场景

  • 对一些状态、类型的字段算是一种空间优化,也算是一种数据约束。但是实际使用中往往因为一些数据内容的变化增加一定的维护成本,甚至是数据丢失问题。所以谨慎使用。

时间类型

目前clickhouse只有三种时间类型

  1. Date 接受 年--****日 的字符串比如 ‘2019-12-16’
  2. Datetime 接受 年--日 时:😗***秒 的字符串比如 ‘2019-12-16 20:50:10’
  3. Datetime64 接受 年--日 时::.****亚秒 的字符串比如 ‘2019-12-16 20:50:10.66’

数组

Array(T):由 T 类型元素组成的数组, T 可以是任意类型,包含数组类型。

创建方式

  1. 使用Array函数
  2. 使用[ ]语法
    • 使用此法时,每个数据都有两个索引,正序的和逆序的(-1)

其他数据类型

看 👉 官网地址

表引擎

作用

  1. 数据的存储方式和位置,写到哪里以及从哪里读取数据
  2. 支持哪些查询以及如何支持。
  3. 并发数据访问。
  4. 索引的使用(如果存在)
  5. 是否可以执行多线程请求
  6. 数据复制参数。

使用

在建表时定义(必须)和设置参数,其对大小写敏感.

常用引擎

  1. TinyLog
  2. Memory
  3. MergeTree
  4. ReplacingMergeTree
  5. SummingMergeTree

关于引擎的补充说明

posted @ 2021-12-30 21:33  KaneQi  阅读(24)  评论(0编辑  收藏  举报