俄罗斯搜索引擎Yandex于2016年6月发布,开发语言为C++,ClickHouse是一个面向联机分析处理(OLAP)的开源的面向列式存储的DBMS。
具有以下特点:
相比传统数据库,查询效率成倍数增长,十分强悍。
更多: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
验证一下
用数据库连接工具连接到clickhouse,推荐dbeaver
国内需要设置 窗口->首选项->链接->驱动->maven 添加仓库:https://maven.aliyun.com/repository/public/ 并设置到第一行
//使用命令,可以看到正常返回的数据
show databases
//创建库
CREATE DATABASE IF NOT EXISTS db_name [ENGINE = engine]
//删除库
DROP DATABASE db_name
创建数据库后,会在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 ...
文档: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
在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
类型String
和FixedString
定长字符串Date
和Date32
表示日期,DateTime
和DateTime64
表示时间JSON
对象将 JSON 文档存储在单个列中UUID
Enum
:当你有少量唯一值时使用 enum ,或者LowCardinality
当你有多达 10,000 个唯一值的列时使用Array
值Map
存储键/值对SimpleAggregateFunction
和AggregateFunction
存储聚合函数结果的中间状态Nested
数据结构就像单元格中的表格Tuple
元素,每个元素都有自己的类型。Nullbale
存储值(而不是列获取其数据类型的默认值)NULL
IPv4
和IPv6
高效存储IP地址Point
、Ring
和Polygon``MultiPolygon
Expression
, Set
,Nothing
和Interval
未完待续