4.ClickHouse系列之数据类型与表引擎介绍

上篇文章已经创建过表及熟悉了基本语法,本文介绍CK的数据类型以及表引擎的一些分类与作用

1. 数据类型

类型
整型 Int8 Int16 Int32 Int64
浮点型 Float32 Float64
Decimal型 Decimal Decimal32 Decimal64 Decimal128
字符串 String FixedString
枚举类型 Enum8 Enum16
时间 Date DateTime
数组 Array

2. 表引擎的使用

表引擎【引擎名称大小写敏感】决定了如何存储表的数据。包括:

  • 数据的存储方式和位置,写入读取位置
  • 支持哪些查询以及如何支持
  • 并发数据访问
  • 索引的使用(如果存在)
  • 是否可以执行多线程请求
  • 数据复制参数
2.1 TinyLog引擎

已列文件的形式保存在磁盘上,不支持索引,没有并发控制。一般保存少量数据的小表。

CREATE TABLE t_tiny_log(id String, name String) ENGINE=TinyLog
2.2 Memory引擎

内存引擎,数据已未压缩的原始形式保存在内存中,服务器重启数据就会消失。读写操作不会相互阻塞,不支持索引。简单查询下有非常高的性能表现(超过10G/S)

CREATE TABLE t_memory(id String, name String) ENGINE=Memory
2.3 MergeTree引擎

ClickHouse中最强大引擎当属MergeTree(合并树)引擎及该系列(*MergeTree)中的其他引擎,支持索引和分区。

DROP TABLE IF EXISTS study.house;
CREATE TABLE study.house (
    id String,
    city String,
    region String,
    name String,
    price Float32 TTL publish_date + interval 3 MONTH,
    publish_date DateTime,
    INDEX price price TYPE minmax GRANULARITY 3
) ENGINE=MergeTree PARTITION BY toYYYYMMDD(publish_date) PRIMARY KEY(id) ORDER BY (id, city, region, name)
SETTINGS index_granularity=8192
  • 对于主键id来说只是提供了数据的一级索引,但是却不是唯一约束。
  • 对于index_granularity索引粒度,指在稀疏索引中两个相邻索引对应数据的间隔
  • 主键【PRIMARY KEY(id)】必须是order by字段的前缀字段
  • 二级索引【INDEX price price TYPE minmax GRANULARITY 3】是对于一级索引粒度的粒度。如一级索引范围为【1,15】、【15,50】、【50,100】,【100,900】,如果二级索引粒度为3,则前三个一级索引范围合并【1,100】、【100,900】
  • TTL即time to live,MergeTree提供了可以管理表或列的生命周期的功能
2.4 ReplacingMergeTree引擎
DROP TABLE IF EXISTS study.house;
CREATE TABLE study.house (
    id String,
    city String,
    region String,
    name String,
    price Float32,
    publish_date DateTime
) ENGINE=ReplacingMergeTree(publish_date) PARTITION BY toYYYYMMDD(publish_date) PRIMARY KEY(id) ORDER BY (id, city, region, name)
SETTINGS index_granularity=8192
  • 实际上是以order by作为唯一键
  • 去重不能跨分区
  • 只有同一批插入或合并分区(合并时间不定)时才会去重,也可以手工合并optimize table study.house final;
  • 去重保留版本字段值【ReplacingMergeTree括号中参数publish_date为版本号】最大的,如果版本字段相同则按插入顺序保留最后一笔
2.5 SummingMergeTree引擎
DROP TABLE IF EXISTS study.house;
CREATE TABLE study.house (
    id String,
    city String,
    region String,
    name String,
    price Float32,
    publish_date DateTime
) ENGINE=SummingMergeTree(price) PARTITION BY toYYYYMMDD(publish_date) PRIMARY KEY(id) ORDER BY (id, city, region, name)
SETTINGS index_granularity=8192
  • 以SummingMergeTree()中指定的列作为汇总列
  • 以order by 列为准,作为维度列
  • 可以填写多列必须数字列,如果不填,以所有非维度列且为数字列的字段作为汇总列
  • 聚合不能跨分区
  • 只有同一批插入或合并分区(合并时间不定)时才会去重,也可以手工合并optimize table study.house final;
  • 其他的列按插入顺序保留第一行

欢迎关注公众号算法小生沈健的技术博客

posted @ 2022-10-21 21:29  算法小生  阅读(65)  评论(0编辑  收藏  举报