ClickHouse学习(一)

0、数据访问的场景需要考虑的点

不同的数据存储方式适用不同的业务场景,数据访问的场景包括:

  • 进行了何种查询、多久查询一次以及各类查询的比例;
  • 每种类型的查询(行、列和字节)读取多少数据;
  • 读取数据和更新之间的关系;
  • 使用的数据集大小以及如何使用本地的数据集;
  • 是否使用事务,以及它们是如何进行隔离的;
  • 数据的复制机制与数据的完整性要求;
  • 每种类型的查询要求的延迟与吞吐量等等。

    1、什么是ClickHouse

    1)ck定义

    ClickHouse是一个用于联机分析(OLAP)的式数据库管理系统(DBMS)。
    来自不同列的值被单独存储,来自同一列的数据被存储在一起。

    2)、OLAP(联机分析)场景的关键特征

  • 绝大多数是请求
  • 数据以相当大的批次(> 1000行)更新,而不是单行更新;或者根本没有更新
  • 已添加到数据库的数据不能修改
  • 对于读取,从数据库中提取相当多的行,但只提取列的一小部分
  • 宽表,即每个表包含着大量的列
  • 查询相对较少(通常每台服务器每秒查询数百次或更少)
  • 对于简单查询,允许延迟大约50毫秒
  • 列中的数据相对较小:数字和短字符串(例如,每个URL 60个字节)
  • 处理单个查询时需要高吞吐量(每台服务器每秒可达数十亿行)
  • 事务不是必须的
  • 对数据一致性要求低
  • 每个查询有一个大表。除了他以外,其他的都很小。
  • 查询结果明显小于源数据。换句话说,数据经过过滤或聚合,因此结果适合于单个服务器的RAM中
    很容易可以看出,OLAP场景与其他通常业务场景(例如,OLTP或K/V)有很大的不同, 因此想要使用OLTP或Key-Value数据库去高效的处理分析查询场景,并不是非常完美的适用方案。例如,使用OLAP数据库去处理分析请求通常要优于使用MongoDB或Redis去处理分析请求。

    2、ClickHouse的特性

    1)优点

  • 真正的列式数据库管理系统。
    ClickHouse不单单是一个数据库, 它是一个数据库管理系统,因为它允许在运行时创建表和数据库、加载数据和运行查询,而无需重新配置或重启服务
  • 数据压缩
    除了在磁盘空间和CPU消耗之间进行不同权衡的高效通用压缩编解码器之外,ClickHouse还提供针对特定类型数据的专用编解码器,这使得ClickHouse能够与更小的数据库(如时间序列数据库)竞争并超越它们。
  • 多核心并行处理
  • 多服务器分布式处理
  • 支持SQL
    ClickHouse支持一种基于SQL的声明式查询语言,它在许多情况下与ANSI SQL标准相同。
    支持的查询GROUP BY, ORDER BY, FROM, JOIN, IN以及非相关子查询
  • 向量引擎
  • 实时的数据更新
  • 索引
  • 适合在线查询
  • 支持近似计算
  • Adaptive Join Algorithm ,支持join多个表
  • 支持数据复制和数据完整性
  • 角色的访问控制

2)缺点

  • 没有完整的事务支持。
  • 缺少高频率,低延迟的修改或删除已存在数据的能力。仅能用于批量删除或修改数据,但这符合 GDPR。
  • 稀疏索引使得ClickHouse不适合通过其键检索单行的点查询。

3、访问接口

ck像es一样暴露两个端口,一个tcp的,一个http的。tcp默认端口:9000 ,http默认端口:8123。一般我们并不直接通过这些端口与ck交互,而是使用一些客户端,这些客户端可以是:

Command-line Client 通过它可以链接ck,然后进行基本的crud操作,还可以导入数据到ck 。它使用tcp端口链接ck
http interface : 能像es一样,通过rest方式,按照ck自己的语法,提交crud
jdbc driver
odbc driver

4、输入、输出格式

1)定义

ClickHouse可以接受和返回各种格式的数据。受支持的输入格式可用于提交给INSERT语句、从文件表(File,URL,HDFS或者外部目录)执行SELECT语句,受支持的输出格式可用于格式化SELECT语句的返回结果,或者通过INSERT写入到文件表。
支持的格式参考:https://clickhouse.com/docs/z...

2)例子

比如插入数据时,指定数据源的格式为JSONEachRow

INSERT INTO UserActivity FORMAT JSONEachRow {"PageViews":5, "UserID":"4324182021466249494", "Duration":146,"Sign":-1} {"UserID":"4324182021466249494","PageViews":6,"Duration":185,"Sign":1}

读取数据时,指定格式为JSONEachRow

SELECT * FROM UserActivity FORMAT JSONEachRow

值得注意的时指定这些格式应该是ck解析或生成的格式,并不是ck最终的的存储格式,ck应该还是按自己的列式格式进行存储。

参考:
1)https://clickhouse.com/docs/zh/
2)https://segmentfault.com/a/11...
3)https://blog.csdn.net/ruizhan...

你可能感兴趣的