目录

  • 简介
  • 安装
  • 基础操作
  • 数据库
  • 分区表
  • 视图
  • 删改
  • 数据类型


简介

俄罗斯搜索引擎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

未完待续