ClickHouse(一)安装和基础操作

目录

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

简介

俄罗斯搜索引擎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)
  • 浮点数:浮点数(Float32Float64)和Decimal定点数
  • Boolean : Boolean类型
  • 字符串StringFixedString定长字符串
  • 日期:使用DateDate32表示日期,DateTimeDateTime64表示时间
  • JSON:该JSON对象将 JSON 文档存储在单个列中
  • UUID :存储值的高性能选项UUID
  • 枚举类型Enum:当你有少量唯一值时使用 enum ,或者LowCardinality当你有多达 10,000 个唯一值的列时使用
  • 数组:任何列都可以定义为Array
  • 字典:用于Map存储键/值对
  • 聚合函数类型:使用SimpleAggregateFunctionAggregateFunction存储聚合函数结果的中间状态
  • 嵌套数据结构Nested数据结构就像单元格中的表格
  • 元组:一个Tuple元素,每个元素都有自己的类型。
  • Nullable:允许您在值“缺失”时Nullbale存储值(而不是列获取其数据类型的默认值)NULL
  • IP地址:使用IPv4IPv6高效存储IP地址
  • 地理类型:用于地理数据,包括PointRingPolygon``MultiPolygon
  • 特殊数据类型:包括Expression, Set,NothingInterval

未完待续

你可能感兴趣的:(数据库,clickhouse,数据库,列式存储)