目录
- 简介
- 安装
- 基础操作
- 数据库
- 表
- 分区表
- 视图
- 增
- 删改
- 数据类型
简介
俄罗斯搜索引擎Yandex于2016年6月发布,开发语言为C++,ClickHouse是一个面向联机分析处理(OLAP)的开源的面向列式存储的DBMS。
具有以下特点:
- ROLAP
- 在线实时查询
- 完整的dbms
- 列式存储
- 不需要任何数据预处理
- 拥有非常完整的sql支持和函数
- 支持批量更新
- 支持高可用
- 不依赖hadoop生态
相比传统数据库,查询效率成倍数增长,十分强悍。
更多:https://clickhouse.com/docs/en/intro
安装
本文基于docker安装,当然有钱也可以直接用云厂商的clickhouse服务。
镜像地址:https://hub.docker.com/r/clickhouse/clickhouse-server
docker run -d --name wd-ch-server --ulimit nofile=262144:262144 -p 9000:9000 -p 8123:8123 -p 9009:9009 -v $(realpath ./ch_data):/var/lib/clickhouse/ -v $(realpath ./ch_logs):/var/log/clickhouse-server/ clickhouse/clickhouse-server
- ulimit 单一进程最大打开文件句柄数
- 9000 tcp端口
- 8123 http端口
- 9009 同步端口
验证一下
用数据库连接工具连接到clickhouse,推荐dbeaver
国内需要设置 窗口->首选项->链接->驱动->maven 添加仓库:https://maven.aliyun.com/repository/public/ 并设置到第一行
//使用命令,可以看到正常返回的数据
show databases
基础操作
数据库
//创建库
CREATE DATABASE IF NOT EXISTS db_name [ENGINE = engine]
//删除库
DROP DATABASE db_name
- IF NOT EXISTS :如果已经存在 则忽略后面的创建
- ENGINE 数据库引擎
- Ordinary :默认引擎
- Dictionary : 字典引擎
- Memory : 内存引擎
- Lazy :日志引擎
- MySQL : mysql 引擎
创建数据库后,会在clickhouse的data目录下创建三个文件
./data/data/db_name //数据文件
./data/metadata/db_name //元数据文件
./data/metadata/db_name.sql //创建数据库使用的语句
表
建表语法和mysql几乎一样
CREATE TABLE [IF NOT EXISTS] [db_name.]table_name(
field_name1 [type] [DEFAULT|MATERIALIZED|ALIAS expr],
field_name2 [type] [DEFAULT|MATERIALIZED|ALIAS expr],
...
) ENGINE = engine;
// 例如创建一个表wdtable 不指定表名则创建在default数据库下
CREATE TABLE IF NOT EXISTS wdtable (
name String,
age Int,
createAt DateTime,
) ENGINE = Memory;
创建表时也可以指定从另一个表里复制
//比如从default表中复制表wdtable到wddb库,并重新指定引擎为TinyLog
CREATE TABLE IF NOT EXISTS wddb.wdtable AS default.wdtable ENGINE = TinyLog
//如果不光需要复制表结构,也需要复制数据,则可以用下面的方式
CREATE TABLE IF NOT EXISTS wddb.wdtable ENGINE = Memory AS SELECT * FROM default.wdtable;
删除表
DROP TABLE [IF EXISTS] table_name;
分区表
语法类似如下,按月分区,分区数据存储在不同的文件中,但分区只适用于MergeTree系表引擎
参考文档:https://clickhouse.com/docs/en/engines/table-engines/mergetree-family/custom-partitioning-key
CREATE ...(
id Int
createAt Date
) ENGINE = MergeTree()
PARTITION BY toYYYYMM(createAt)
ORDER BY id
视图
参考链接:https://clickhouse.com/docs/en/sql-reference/statements/create/view clickhouse中有四种视图,常用普通和物化视图,实时视图和窗口视图是实验性功能不做介绍
普通视图 不存储任何数据。他们只是在每次访问时从另一个表执行读取。换句话说,普通视图只不过是保存的查询。从视图中读取时,此保存的查询用作FROM子句中的子查询。
CREATE VIEW [IF NOT EXISTS] [db_name.]view_name AS SELECT ...
物化视图 创建方式如下
CREATE MATERIALIZED VIEW [IF NOT EXISTS] [db.]table_name [ON CLUSTER] [TO[db.]name] [ENGINE = engine] [POPULATE] AS SELECT ...
- 向源表插入数据时,也会同时更新视图数据
- 删除源表数据,则不会删除视图数据
- 使用POPULATE 初始化视图数据,不使用则视图初始创建为空
- 物化视图极度类似一张表,有具体的存储文件,也可以指定引擎,同时适用show table,drop table等语句。
增
文档:https://clickhouse.com/docs/en/sql-reference/statements/insert-into 可以像mysql一样增加
INSERT INTO [db.]table [(c1, c2, c3)] VALUES (v11, v12, v13), (v21, v22, v23), ...
也可以从已有的数据集中增加
INSERT INTO [db.]table [(c1, c2, c3)] SELECT ...
也可以从一下固定格式的文件中增加
INSERT INTO [db.]table [(c1, c2, c3)] FORMAT Values (v11, v12, v13), (v21, v22, v23), ...
clickhouse中所有数据操作都是面相block数据块,并且具备原子性,要么这批数据全部成功,要么全部失败。且因为这种block块式的结构,非常适合批量插入,默认单块最多1048576行数据。注意只有在使用服务端接口时才生效,像insert …select这种是不生效的
删改
clickhouse中,删除和修改本质上是一种mutation操作。如下
ALTER TABLE [db.]table [ON CLUSTER cluster] DELETE WHERE filter_expr
ALTER TABLE [db.]table [ON CLUSTER cluster] UPDATE column1 = expr1 [, ...] [IN PARTITION partition_id] WHERE filter_expr
- 主键或分区键不能用来修改
- 查询处理的同步性由mutations_sync设置定义。默认情况下,它是异步的。值为1:等待一个副本完成 2:等待所有副本完成。
在MergeTree系列的引擎中可以使用类mysql语法删除
DELETE FROM [db.]table [ON CLUSTER cluster] [WHERE expr]
DELETE FROM table WHERE condition
等价于ALTER table UPDATE _row_exists = 0 WHERE condition
可以看出这是一种标记删除。物理上在MergeTree系列引擎合并的时候再删除。同样它也收受mutations_sync的影响。
数据类型
参考文档:https://clickhouse.com/docs/en/sql-reference/data-types
- 整数类型:有符号和无符号整数(
UInt8
,UInt16
,UInt32
,UInt64
,UInt128
,UInt256
,Int8
,Int16
,Int32
,Int64
,Int128
,Int256
) - 浮点数:浮点数(
Float32
和Float64
)和Decimal定点数 - Boolean : Boolean类型
- 字符串:String和FixedString定长字符串
- 日期:使用Date和Date32表示日期,DateTime和DateTime64表示时间
- JSON:该JSON对象将 JSON 文档存储在单个列中
- UUID :存储值的高性能选项UUID
- 枚举类型Enum:当你有少量唯一值时使用 enum ,或者LowCardinality当你有多达 10,000 个唯一值的列时使用
- 数组:任何列都可以定义为Array值
- 字典:用于Map存储键/值对
- 聚合函数类型:使用SimpleAggregateFunction和AggregateFunction存储聚合函数结果的中间状态
- 嵌套数据结构:Nested数据结构就像单元格中的表格
- 元组:一个Tuple元素,每个元素都有自己的类型。
- Nullable:允许您在值“缺失”时Nullbale存储值(而不是列获取其数据类型的默认值)
NULL
- IP地址:使用IPv4和IPv6高效存储IP地址
- 地理类型:用于地理数据,包括
Point
、Ring
和Polygon``MultiPolygon
- 特殊数据类型:包括Expression, Set,Nothing和Interval
未完待续