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

342 阅读3分钟

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

1. 数据类型

类型
整型Int8Int16Int32Int64
浮点型Float32Float64
Decimal型DecimalDecimal32Decimal64Decimal128
字符串StringFixedString
枚举类型Enum8Enum16
时间DateDateTime
数组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;
  • 其他的列按插入顺序保留第一行

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