ClickHouse-简单了解

文章目录

        • 前言
        • 数据库引擎
        • 数据表引擎
          • Log 系列
          • Integration 系列
          • Special 系列
          • MergeTree 系列
        • ClickHouse 数据类型
        • ClickHouse 常用的函数

前言

什么是 ClickHouse?简单来说它是一个高性能,面向列的SQL数据库管理系统(DBMS),用于在线分析处理(OLAP)。

ClickHouse 提供了大量的数据引擎,分为数据库引擎、表引擎,根据数据特点及使用场景选择合适的引擎,这很重要。其相关文档为:

  • 数据库引擎

  • 数据表引擎

数据库引擎默认是 Ordinary,在这种数据库下的表可以是任意类型引擎。生产环境中常用的表引擎是 MergeTree 系列,也是官方主推的引擎。

数据库引擎

  • Ordinary:默认引擎,在大多数情况下都会使用默认引擎,使用时无须刻意声明。在此数据库下可以使用任意类型的表引擎。
  • Dictionary:字典引擎,此类数据库会自动为所有数据字典创建它们的数据表。
  • Memory:内存引擎,用于存入临时数据。此类数据库下的数据表只会停留在内存中,不会涉及任何磁盘操作,当服务重启后数据会被清除。
  • Lazy:日志引擎,此类数据库下只能使用 Log 系列的表引擎。
  • MySQL:MySQL 引擎,此类数据库下会自动拉取远端 MySQL 中的数据,并为它们创建 MySQL 表引擎的数据表。

数据表引擎

表引擎在 ClickHouse 中的作用十分关键,直接决定了数据如何存储和读取、是否支持 index、支持的 query 种类、是否支持主备复制等。其表引擎比较多,各有各的用途,那应该如何选择呢?

  • Log 系列:用来做小表数据分析。
  • MergeTree 系列:用来做大数据量分析。
  • Integration 系列:多用于外表数据集成。

表引擎概述

ClickHouse-简单了解_第1张图片

Log 系列

Log 系列表引擎功能相对简单,主要用于快速写入小表(1百万行左右的表),然后全部读出的场景。

几种 Log 表引擎的共性是:

  • 数据被顺序 append 写到磁盘上;
  • 不支持 delete、update;
  • 不支持 index;
  • 不支持原子性;
  • insert 会阻塞 select 操作。

它们彼此之间的区别是:

  • TinyLog:不支持并发读取数据文件,查询性能较差;格式简单,适合用来暂存中间数据;
  • StripLog:支持并发读取数据文件,查询性能比 TinyLog 好;将所有列存储在同一个大文件中,减少了文件个数;
  • Log:支持并发读取数据文件,查询性能比 TinyLog 好;每个列会单独存储在一个独立文件中。
Integration 系列

主要用于将外部数据导入到 ClickHouse 中,或者在 ClickHouse 中直接操作外部数据源。

  • Kafka:将 Kafka Topic 中的数据直接导入到 ClickHouse;
  • MySQL:将 MySQL 作为存储引擎,直接在 ClickHouse 中对 MySQL 表进行 select 等操作;
  • JDBC/ODBC:通过指定 jdbc、odbc 连接串读取数据源;
  • HDFS:直接读取 HDFS 上的特定格式的数据文件。
Special 系列

大多是为了特定的场景而定制。如:

  • Memory:将数据存储在内存中,重启后会导致数据丢失。查询性能极好,适合对于数据持久性没有要求的 1 亿以下的小表。通过用来做临时表。
  • Buffer:为目标设置一个内存 buffer,当 buffer 达到一定条件之后会 flush 到磁盘。
  • File:直接将本地文件作为数据存储。
  • Null:写入数据被丢弃、读取数据为空。
MergeTree 系列

官方主推存储引擎,支持几乎所有 ClickHouse 核心功能。适用于负载任务,可以快速插入数据(极大量的数据插入到一张表中)并进行后续的后台数据处理。

表结构,MergeTree 官方文档表结构:

CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
    name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
    name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
    ...
    INDEX index_name1 expr1 TYPE type1(...) GRANULARITY value1,
    INDEX index_name2 expr2 TYPE type2(...) GRANULARITY value2
) ENGINE = MergeTree()
[PARTITION BY expr]
[ORDER BY expr]
[PRIMARY KEY expr]
[SAMPLE BY expr]
[SETTINGS name=value, ...]
  • ENGINE—引擎名和参数。ENGINE = MergeTree(). MergeTree 引擎没有参数

  • PARTITION BY—分区键

  • ORDER BY—表的排序键

  • PRIMARY KEY—主键【默认情况下主键跟排序键(由 ORDER BY 子句指定)相同】

  • SAMPLE BY—用于抽样的表达式

  • SETTINGS—影响 MergeTree 性能的额外参数:

    • index_granularity—索引粒度。即索引中相邻『标记』间的数据行数。默认值,8192。

    • index_granularity_bytes—索引粒度,以字节为单位,默认值: 10Mb。

    • enable_mixed_granularity_parts—启用或禁用通过index_granularity_bytes控制索引粒度的大小。

    • merge_with_ttl_timeout—TTL合并频率的最小间隔时间。默认值: 86400 (1天)。

    • write_final_mark—启用或禁用在数据片段尾部写入最终索引标记。默认值:1(不建议更改)。

    • storage_policy—存储策略。

ReplacingMergeTree:

有去重功能。它会删除具有相同主键的重复项,但数据的去重只会在合并的过程中出现。合并会在未知的时间在后台进行,所以你无法预先作出计划。即不保证没有重复的数据出现。

表结构:

CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
    name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
    name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
    ...
) ENGINE = ReplacingMergeTree([ver])
[PARTITION BY expr]
[ORDER BY expr]
[PRIMARY KEY expr]
[SAMPLE BY expr]
[SETTINGS name=value, ...]

合并的时候,ReplacingMergeTree 从所有具有相同主键的行中选择一行留下:

  • 如果ver 列未指定,选择最后一条。
  • 如果ver 列已指定,选择 ver 值最大的版本。

SummingMergeTree:

有汇总求和功能。当合并 SummingMergeTree 表的数据片段时,ClickHouse 会把所有具有相同主键的行合并为一行,该行包含了被合并的行中具有数值数据类型的列的汇总值。

表结构:

CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
    name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
    name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
    ...
) ENGINE = SummingMergeTree([columns])
[PARTITION BY expr]
[ORDER BY expr]
[SAMPLE BY expr]
[SETTINGS name=value, ...]

AggregatingMergeTree:

有聚合功能。

CollapsingMergeTree:

有折叠删除功能。

VersionedCollapsingMergeTree:

有版本折叠功能。

GraphiteMergeTree:

有压缩汇总功能。

ClickHouse 数据类型

数据类型

  • Integer types:有符号和无符号整数 ( UInt8UInt16UInt32UInt64UInt128UInt256Int8Int16Int32Int64Int128Int256 )。
  • Floating-point numbers:浮点数( Float32Float64 )和 Decimal 值。
  • Boolean:ClickHouse 具有 Boolean 类型。
  • Strings:StringFixedString
  • Dates:使用 DateDate32 表示天数,使用 DateTimeDateTime64 表示时间实例。
  • JSON:JSON 对象将 JSON 文档存储在单个列中。
  • UUID:用于存储 UUID 值的高性能选项。
  • Low cardinality types:当具有少量唯一值时,请使用 Enum ,当列最多有 10,000 个唯一值时,请使用 LowCardinality
  • Arrays:任何列都可以定义为值的 Array
  • Maps:使用 Map 存储键/值对。
  • Aggregation function types:使用 SimpleAggregateFunctionAggregateFunction 存储聚合函数结果的中间状态。
  • Nested data structures:Nested 数据结构类似于单元格内的表。
  • Tuples:元素的 Tuple ,每个元素都有单独的类型。
  • Nullable:Nullable 允许您在值“缺失”时将值存储为 NULL (而不是列获取其数据类型的默认值)。
  • IP addresses:使用 IPv4IPv6 高效存储 IP 地址。
  • Geo types:用于地理数据,包括 PointRingPolygonMultiPolygon
  • Special data types:包括 ExpressionSetNothingInterval

ClickHouse 常用的函数

时间日期函数

你可能感兴趣的:(数据库,clickhouse,数据库,sql)