ClickHouse是个由老毛子国内市场使用率第一的搜索引擎Yandex开源的OLAP型列式数据库。
背景
之前因为业务接触到ClickHouse,但因为没有系统的了解过导致遇见个很小的问题、花了大量的时间、用了很挫的方式来解决问题,痛定思痛的情况下决心系统的逐步学习一下。ClickHouse无论是存储还是使用方式都不同程度的异于我们常用的Mysql,PostgreSql,Mssql等行式数据库,但它支持绝大部分的SQL语法。
数据引擎
ClickHouse(基于v21.7)的引擎分为数据库引擎和表引擎。
数据库引擎
- MySQL
顾名思义,和Mysql数据库有关系。该引擎允许连接远程Mysql数据库并且执行Sql交换数据。但是仅支持部分操作(读写)。
- MaterializeMySQL
v20.8新增的引擎,这是一个处在
实验阶段的引擎
,通过名称可以看出来也是和Mysql相关的引擎,该引擎通过binlog日志进行全量(第一次)和增量实时物化(可以理解为同步?)Mysql数据,原本Mysql的DDL和DML操作都可以通过ClickHouse执行。 - Lazy
在最后一次操作该表之后,仅在固定秒数内将表保留在运存中,该秒数通过
expiration_time_in_seconds
参数控制。 - Atomic
新版本默认的数据库引擎,支持对表非阻塞的
drop
、rename
操作以及原子操作交换两张表。 - PostgreSQL
该引擎的特性和
MySQL
引擎大致相同,只不过是对PostgreSql的支持。 - MaterializedPostgreSQL
与
MaterializeMySQL
一样,是实验阶段的引擎
。作为PostgreSql数据表的副本进行后台同步。 - Replicated
基于
Atomic
引擎,通过将DDL操作日志写入ZK并在数据库的所有副本上执行的元数据复制(复制数据库)。可以同时运行和更新多个复制的数据库。但是同一个复制的数据库不能有多个副本。
- MySQL
表引擎(表引擎比数据库引擎稍微复杂一些,表引擎又分为四大系列)
- MergeTree系列
- Log系列
- Integrations系列
- Special类
MergeTree系列
MergeTree系列的表引擎比较常用,它支持主键、数据分区、数据副本和数据采样等特性,同时支持重要的alter
操作语句。
- ReplacingMergeTree
清洗数据,去除重复数据。当数据重复时数据去重策略有两种:通过
ReplacingMergeTree({version})
建立version字段则保留version字段最大值,否则则保留最后一行。 - SummingMergeTree
按照预先定义的聚合条件汇总数据
- AggregatingMergeTree
SummingMergeTree
引擎的进阶版。能够在合并分区时,按照预先定义的聚合条件汇总数据。 - CollapsingMergeTree
支持行级数据的更新和删除,通过指定字段
CollapsingMergeTree({sign})
标记数据行的状态(状态值:1,-1)。分区合并时,同一个数据分区内sign值为1的数据行会和下一行sign值为-1的抵消删除。如果并发写入时则会导致乱序问题,即sign值1和-1的数据行并不相临的问题。 - VersionedCollapsingMergeTree
CollapsingMergeTree
引擎的进阶版。通过VersionedCollapsingMergeTree({sign},{version})
新增version字段解决乱序问题。 - GraphiteMergeTree
存储时序数据库Graphite的数据。
Log系列
Log引擎面向的应用场景一般是:小数据量、多写少查、单次查询数据较大。
- StripLog
支持多线程并发读取文件(data.bin),数据写入时会将所有数据列存储在同一个文件中。
- TinyLog
数据写入时每个数据列存储在不同的文件({column}.bin),但不支持多线程并发读取文件。
- Log
支持多线程并发读取文件,写入时每个数据列单独存储文件。
Integrations系列
该类引擎提供多种方式与外部系统集成(外部表),支持包括但不仅限于:
- ODBC
- JDBC
- Mysql
- MongoDB
- HDFS
- S3
- Kafka
- EmbeddedRocksDB
- RabbitMQ
- PostgreSQL
- SQLite
- Hive
Special类
这个分类下的引擎适用于定制化的业务场景。
- 内存类
- Memory
将数据存储在内存中,但不提供持久化操作,重启数据就跑丢了。
- Set
适用于集合类型的查询操作,比如:in。
- Join
望文生义,为了连表查询。
- Buffer
通俗的说像是数据脏页设置一个刷新阈值,达到即刷新到磁盘中。
- Memory
- 中间件类
- Distributed
自动分片、自动写入和查询数据。
- Dictionary
自动为数据字典创建数据表。
- Merge
合并多个相同表结构的查询结果。
- Distributed
- 其他
- Null
写入的数据会被丢弃 … 暂时不懂什么用途,官方的描述是适用于视图展示。
- Url
配合RESTful接口,操作会转化为:insert => post、select => get。
- Live View
实验阶段的引擎
,对事件监听进行实时数据计算。适用场景比如:证券网站。
- Null
总结
简单的浏览了ClickHouse不同的数据引擎,接下来会学习存储结构和索引方式(搞清楚为什么查询这么快)。