ClickHouse

本文参考CK中文官方文档:https://clickhouse.com/docs/zh/
ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS)

在传统的行式数据库系统中,数据按如下顺序存储:

ROW Title Code Note Datetime
#0 Database 0 数据库 2022-07-07 16:03:00
#1 MySQL 1 关系型数据库 2022-07-07 16:03:10
#2 Nebula 1 图数据库 2022-07-07 16:03:20
#3 ClickHouse 1 列式数据库 2022-07-07 16:03:30
#N 1

处于同一行中的数据总是被物理的存储在一起。常见的行式数据库系统有:MySQLPostgresMS SQL Server

而在列式数据库系统中,数据则按如下顺序存储

ROW #0 #1 #2 #3 #4
Title Database MySQL Nebula ClickHouse
Code 0 1 1 1 1
Note 数据库 关系型数据库 图数据库 列式数据库
Datetime 2022-0707 16:03:00 2022-0707 16:03:10 2022-0707 16:03:20 2022-07-07 16:03:30

这些示例只显示了数据的排列顺序,来自不同列的值被单独存储,来自同一列的数据被存储在一起。常见的列式数据库系统有:VerticaParaccel(Actian Matrix, Amazon Redshift)、Sybase IQExasolInfobrightInfiniDBMonetDB(VectorWise, Actian Vector)、LucidDBSAP HANAGoogle DremelGoogle PowerDrillDruidkdb+

不同的数据存储方式适用不同的业务场景,数据访问的场景包括:进行了何种查询、多久查询一次以及各类查询的比例;每种类型的查询(行、列和字节)读取多少数据;读取数据和更新之间的关系;使用的数据集大小以及如何使用本地的数据集;是否使用事务,以及它们是如何进行隔离的;数据的复制机制与数据的完整性要求;每种类型的查询要求的延迟与吞吐量等等

系统负载越高,依据使用场景进行定制化就越重要,并且定制将会变的越精细。没有一个系统能够同时适用所有不同的业务场景。如果系统适用于广泛的场景,在负载高的情况下,要兼顾所有的场景,那么将不得不做出选择:平衡 OR 效率

联机分析(OLAP)场景的关键特征

· 绝大多数是读请求

· 数据以相当大的批次(> 1000行)更新,而不是单行更新;或者根本没有更新。

· 已添加到数据库的数据不能修改。

· 对于读取,从数据库中提取相当多的行,但只提取列的一小部分。

· 宽表,即每个表包含着大量的列

· 查询相对较少(通常每台服务器每秒查询数百次或更少)

· 对于简单查询,允许延迟大约50毫秒

· 列中的数据相对较小:数字和短字符串(例如,每个URL 60个字节)

· 处理单个查询时需要高吞吐量(每台服务器每秒可达数十亿行)

· 事务不是必须的

· 对数据一致性要求低

· 每个查询有一个大表。除了他以外,其他的都很小。

· 查询结果明显小于源数据。换句话说,数据经过过滤或聚合,因此结果适合于单个服务器的RAM中

很容易可以看出,OLAP场景与其他通常业务场景(例如,OLTP或K/V)有很大的不同, 因此想要使用OLTP或Key-Value数据库去高效的处理分析查询场景,并不是非常完美的适用方案。例如,使用OLAP数据库去处理分析请求通常要优于使用MongoDB或Redis去处理分析请求。

列式数据库更适合OLAP场景的原因

列式数据库更适合于OLAP场景(对于大多数查询而言,处理速度至少提高了100倍)

I/O

1.针对分析类查询,通常只需要读取表的一小部分列。在列式数据库中你可以只读取你需要的数据。例如,如果只需要读取100列中的5列,这将帮助你最少减少20倍的I/O消耗。

2.由于数据总是打包成批量读取的,所以压缩是非常容易的。同时数据按列分别存储这也更容易压缩。这进一步降低了I/O的体积。

3.由于I/O的降低,这将帮助更多的数据被系统缓存。

CPU

由于执行一个查询需要处理大量的行,因此在整个向量上执行所有操作将比在每一行上执行所有操作更加高效。同时这将有助于实现一个几乎没有调用成本的查询引擎。如果你不这样做,使用任何一个机械硬盘,查询引擎都不可避免的停止CPU进行等待。所以,在数据按列存储并且按列执行是很有意义的。

有两种方法可以做到这一点:

1.向量引擎:所有的操作都是为向量而不是为单个值编写的。这意味着多个操作之间的不再需要频繁的调用,并且调用的成本基本可以忽略不计。操作代码包含一个优化的内部循环。

2.代码生成:生成一段代码,包含查询中的所有操作。

这是不应该在一个通用数据库中实现的,因为这在运行简单查询时是没有意义的。但是也有例外,例如,MemSQL使用代码生成来减少处理SQL查询的延迟(只是为了比较,分析型数据库通常需要优化的是吞吐而不是延迟)。

为了提高CPU效率,查询语言必须是声明型的(SQL或MDX), 或者至少一个向量(J,K)。 查询应该只包含隐式循环,允许进行优化。

安装ClickHouse

使用CentOS基于rpm的linux发行版官方预编译rpm包,添加官方存储库:

1
2
3
$ sudo yum install -y yum-utils
$ sudo yum-config-manager --add-repo https://packages.clickhouse.com/rpm/clickhouse.repo
$ sudo yum install -y clickhouse-server clickhouse-client

启动CK

运行以下命令将在后台启动服务,日志文件将输出在/var/log/clickhouse-server/文件夹

1
2
$ sudo /etc/init.d/clickhouse-server start
$ clickhouse-client # 或执行 "clickhouse-client --password" 来添加密码

要手动从控制台启动服务,执行:

1
$ clickhouse-server --config-file=/etc/clickhouse-server/config.xml

日志将被打印至控制台

当服务成功启动后,执行$ clickhouse-client来连接CK数据库,默认情况下,使用default用户并不携带密码连接到localhost:9000,还可以使用–host参数连接到指定服务器。

终端必须使用UTF-8编码。

ClickHouse数据库可视化工具Dbeaver

目前navicat并不支持clickhouse的可视化查询,可以使用dbeaver数据库管理工具来代替navicat

Dbeaver安装

下载最新版本的DBeaver RPM安装包并使用rpm/dnf或yum软件包管理器进行安装

1
2
$ wget https://dbeaver.io/files/dbeaver-ce-latest-stable.x86_64.rpm
$ sudo rpm -Uvh ./dbeaver-ce-latest-stable.x86_64.rpm

完成后即可在终端执行$ dbeaver来启动dbeaver,再连接到CK(需要安装CK在线包)


ClickHouse数据库操作

创建新的数据库TEST(删除为DROP)

1
localhost :) CREATE DATABASE TEST

查看数据库、数据表

1
2
localhost :) SHOW DATABASES
localhost :) SHOW TABLES IN TEST

创建数据表

ClickHouse有自己的数据类型,每个表都必须指定一个Engine属性来确定要创建的表的类

1
localhost :) CREATE TABLE TEST.testable (id String,time Date,name String,code FixedString(2))ENGINE=MergeTree() ORDER BY (time)

执行

1
localhost :) DESCRIBE TEST.testable

来描述表

添加数据

1
localhost :) INSERT INTO TEST.testable VALUES ('001','2022-07-07','MySQL','01')

或指定数据所在的列:

1
localhost :) INSERT INTO TEST.testable(id,time,name,code) VALUES ('002','2022-07-07','SQLite','01')




指定列不插入数据:

1
localhost :) INSERT INTO TEST.testable(* EXCEPT(code)) VALUES ('0000','2022-07-07','nosql')

SELECT

1
2
localhost :) SELECT * FROM TEST.testable
localhost :) SELECT * FROM TEST.testable WHERE name='MySQL'

Powered by Hexo and Hexo-theme-hiker

Copyright © 2017 - 2026 青域 All Rights Reserved.

UV : | PV :