这是我参与8月更文挑战的第2天,活动详情查看:8月更文挑战
ClickHouse 是俄罗斯的Yandex于2016年开源的列式存储数据库(DBMS),主要用于在线分析处理查询(OLAP),能够使用SQL查询实时生成分析数据报告。
OLAP场景的关键特征
- 大多数是读请求
- 数据总是以相当大的批(> 1000 rows)进行写入
- 不修改已添加的数据
- 每次查询都从数据库中读取大量的行,但是同时又仅需要少量的列
- 宽表,即每个表包含着大量的列
- 较少的查询(通常每台服务器每秒数百个查询或更少)
- 对于简单查询,允许延迟大约50毫秒
- 列中的数据相对较小: 数字和短字符串(例如,每个URL 60个字节)
- 处理单个查询时需要高吞吐量(每个服务器每秒高达数十亿行)
- 事务不是必须的
- 对数据一致性要求低
- 每一个查询除了一个大表外都很小
- 查询结果明显小于源数据,换句话说,数据被过滤或聚合后能够被盛放在单台服务器的内存中
一、优点
- 海量数据存储
- 分布式运算
- 支持实时数据分析
- 友好SQL语法,出色函数支持
二、缺点
- 不支持事务,不支持真正的删除/更新
- 不支持二级索引
- join实现与众不同
- 不支持窗口功能
- 元数据管理需要人为干预
三、性能
卓越的实时分析能力
以性能表现突出的单表为例,使用单表100G,3亿行数据,集群规模8核20G*3,简单的查询在毫秒级完成,复杂查询秒级,查询速度较Presto、SparkSQL提升3-6倍,较Hive提升30-100倍。
超高速的查询
对比Presto、Impala、Hawq、Greenplum,ClickHouse以其分布式计算、多核计算、向量化执行与SIMD、代码生成技术以及列式存储等特性,实现了超高速的查询,凸显了更优越的性能。
四、存储磁盘
ClickHouse依赖于ZooKeeper实现分布式系统的协调工作,在ClickHouse并发写入量较大时,ZooKeeper对元数据存储处理不及时,会导致ClickHouse副本间同步出现延迟,降低集群整体性能。
解决方案:采用SSD盘的ZooKeeper大幅提高IO的性能,在表个数小于100,数据量级在TB级别时,也可采用HDD盘,其他情况都建议采用SSD盘。
五、数据类型
整型
固定长度的整型,包括有符号整型或无符号整型。
1、整型范围(-2n-1~2n-1-1):
- Int8 - [-128 : 127]
- Int16 - [-32768 : 32767]
- Int32 - [-2147483648 : 2147483647]
- Int64 - [-9223372036854775808 : 9223372036854775807]
2、无符号整型范围(0~2n-1):
- UInt8 - [0 : 255]
- UInt16 - [0 : 65535]
- UInt32 - [0 : 4294967295]
- UInt64 - [0 : 18446744073709551615]
浮点型
- Float32 - float
- Float64 – double
布尔型
没有单独的类型来存储布尔值。可以使用 UInt8 类型,取值限制为 0 或 1
字符串
1、String
字符串可以任意长度的。它可以包含任意的字节集,包含空字节。
2、FixedString(N)
- 固定长度 N 的字符串,N 必须是严格的正自然数。当服务端读取长度小于 N 的字符串时候,通过在字符串末尾添加空字节来达到 N 字节长度。 当服务端读取长度大于 N 的字符串时候,将返回错误消息。
- 与String相比,极少会使用FixedString,因为使用起来不是很方便
枚举类型
包括 Enum8 和 Enum16 类型。Enum 保存 'string'= integer 的对应关系
数组
- Array(T):由 T 类型元素组成的数组。
- T 可以是任意类型,包含数组类型。 但不推荐使用多维数组,ClickHouse 对多维数组的支持有限。例如,不能在 MergeTree 表中存储多维数组
元组
Tuple(T1, T2, ...):元组,其中每个元素都有单独的类型
Date
日期类型,用两个字节存储,表示从 1970-01-01 (无符号) 到当前的日期值
DateTime
时间戳类型。用四个字节(无符号的)存储 Unix 时间戳)。允许存储与日期类型相同的范围内的值。最小值为 1970-01-01 00:00:00。时间戳类型值精确到秒(没有闰秒)
Nested
嵌套数据结构类似于嵌套表。嵌套数据结构的参数(列名和类型)与 CREATE 查询类似。每个表可以包含任意多行嵌套数据结构
六、表引擎
表引擎(即表的类型)决定:
- 数据的存储方式和位置,写到哪里以及从哪里读取数据
- 支持哪些查询以及如何支持
- 并发数据访问
- 索引的使用(如果存在)
- 是否可以执行多线程请求
- 数据复制参数
引擎类型
1、MergeTree
适用于高负载任务的最通用和功能最强大的表引擎。这些引擎的共同特点是可以快速插入数据并进行后续的后台数据处理。MergeTree系列引擎支持数据复制(使用Replicated*的引擎版本),分区和一些其他引擎不支持的其他功能。
该类型的引擎:
- MergeTree
- ReplacingMergeTree
- SummingMergeTree
- AggregatingMergeTree
- CollapsingMergeTree
- VersionedCollapsingMergeTree
- GraphiteMergeTree
2、LOG
具有最小功能的轻量级引擎。当您需要快速写入许多小表(最多约100万行)并在以后整体读取它们时,该类型的引擎是最有效的。 该类型的引擎:
3、Integration Engines
用于与其他的数据存储与处理系统集成的引擎。
该类型的引擎:
4、Special Engines
该类型的引擎: