ClickHouse 程序员入门精要

👈👈👈 欢迎点赞收藏关注哟

首先分享之前的所有文章 >>>> 😜😜😜
文章合集 : 🎁 juejin.cn/post/694164...
Github : 👉 github.com/black-ant
CASE 备份 : 👉 gitee.com/antblack/ca...

一. 前言

写了一些项目后,渐渐发现,常规的数据库本身具有极限,在一些特定的场景下,整体就显得很吃力了。

到了这个时候,就要考虑使用其他类型的数据库了,这里就来学习一下 ClickHouse 这个数据库。

二. ClickHouse 功能和作用

2.1 Clickhouse 是个什么

@ clickhouse.com/docs/zh/int...

总结下来就是 :

  • ClickHouse 是一个列式数据库管理系统 。 注意 , 它不仅仅只是一个数据库,还是一个管理系统
  • 它具有一些优异的特性,包括数据压缩 , 可以在磁盘上运行(有的数据库只能在内存运行),可以多核心并行
  • 支持多服务器分布式处理
  • 支持 SQL 语句 (基本上可以和 MySQL基本语句兼容 ,DDL 略有不同)
  • 支持向量引擎 (这可以提高查询的性能)
  • 可以实时更新数据 (写入不会有锁,不会产生锁竞争)
  • 支持索引 (可以通过等值比对和范围查询)

在性能方面 ,Clickhose 很强 ,我们自己业务系统的参数不好给出,可以看官方文档里面的 @ 性能 | ClickHouse Docs

内容补充 - 什么是列式数据库 ?

通常我们用的 MySQL Inner DB 就是行式数据库,行式场景下,每一行即为一个数据单元。列式数据库不一样,它每一列为一个数据单元。 如果以一个 JSON 图展示 ,他们的区别如下 :

内容补充 - 列式数据库的查询

这里借用官网的Gif图 ,效果就很清楚了 :

以上分别是行式数据库的读取方式和列式的对比 :

  • 在行式数据库中,哪怕我们只需要一个字段,在读取空间和扫描逻辑上都是对整行数据进行处理 哪怕最后通过SQL写法只返回了一个值
  • 而在列式读取过程中,由于一列里面数据独立,所以可以直接读取我们需要范围的所有单列数据。

内容补充 : 为什么列式数据库看起来很快 ?

  • IO 更少 : 由于每次读取的数据更少,只需要读取需要的列,每次 IO 扫描都会减少很多
  • 压缩更简单 : 按列分别存储可以让压缩更简单,当然根源还是让IO变少
  • 向量引擎 : 虽然我还没搞懂这东西的原理,但是通过这个引擎能提高CPU的性能。数据不仅按列存储,同时会按照向量进行处理

2.2 ClickHouse 里面的引擎

ClickHouse 里面的引擎是用于查询和存储数据的,相对的,分为表引擎和查询引擎两种 :

  • 表引擎 :
    • MergeTree 系列 : Clickhouse 里面最常见的表引擎,支持分区,主键,索引
    • Log : 轻量级表引擎,但是他是一种行式存储引擎
    • CollapsingMergeTree : 特殊表引擎,支持在线聚合数据
    • Distributed : 分布式表引擎
  • 查询引擎 :
    • Vectorized : 向量化查询引擎,通过向量算法提高查询效率
    • Scalar : 标量查询引擎,使用传统的查询算法
    • Distributed : 分布式查询引擎,将查询分到多个节点上,从而提高效率

当然学习这一块的时候还会有很多疑惑,在 ClickHouse 里面还有数据库引擎 ,而在官网里面,数据库引擎看起来像对应很多不同的数据库 (例如 MySQL , Atomic ),这又是什么?

以其中的 MySQL 数据库引擎为例 ,MySQL引擎用于将远程的MySQL服务器中的表映射到ClickHouse中,并允许您对表进行INSERT和SELECT查询,以方便您在ClickHouse与MySQL之间进行数据交换

MySQL数据库引擎会将对其的查询转换为MySQL语法并发送到MySQL服务器中

@ clickhouse.com/docs/zh/eng...

总结 : 所以,数据库引擎在我看来主要是一层代理。

三. Docker 部署 ClickHouse

因为只是基础的使用,这里直接选择 Docker 部署 :

与其他的 DB Docker 相比, ClickHouse 的部署稍微有点麻烦,其核心点在于配置文件的问题,由于 Docker 部署的时候需要配置文件,所以需要

需要启动2次数据库,在此期间

java 复制代码
// S1 : 拉取 Clickhouse 镜像
docker pull clickhouse/clickhouse-server

// S2 : 创建基本路径
mkdir -p /data/clickhouse/data /data/clickhouse/config /data/clickhouse/log


// S3 : 第一次启动容器 (用于生成配置文件)
docker run -d --name clickhouse-server --ulimit nofile=262144:262144 -p 8123:8123 -p 9000:9000 -p 9009:9009 clickhouse/clickhouse-server:latest

// S4 : 把 Clickhouse 容器中的配置文件拷贝出来
docker cp clickhouse-server:/etc/clickhouse-server/config.xml /data/clickhouse/config/config.xml
docker cp clickhouse-server:/etc/clickhouse-server/users.xml /data/clickhouse/config/users.xml


// S5 : 对拷贝的文件进行配置- 密码配置 (这里会得到一串密码)
PASSWORD=$(base64 < /dev/urandom | head -c14); echo "123456"; echo -n "123456" | sha256sum | tr -d '-'
vim /data/clickhouse/config/users.xml
?- 此处修改其中 <password></password> 部分,修改其为 password_sha256_hex ,再将上面拿到的密码配置进去
<password_sha256_hex>87c84143f4fad12664d0ad8915874f509a5b2e82d85957176a541905509d6755</password_sha256_hex>

- 如果要后续访问,需要修改 config
vim /data/clickhouse/config/config.xml
- <listen_host>::</listen_host> : 将这一配置注释打开

// S6 : 移除刚才的容器,后面重新部署
docker rm -f clickhouse-server


// S7 : 重新部署一个 ClickHouse
docker run -d --name clickhouse-server --ulimit nofile=262144:262144 \
-p 8123:8123 -p 9000:9000 -p 9009:9009 \
-v /data/clickhouse/data:/var/lib/clickhouse:rw \
-v /data/clickhouse/log:/var/log/clickhouse-server:rw \
-v /data/clickhouse/config/config.xml:/etc/clickhouse-server/config.xml \
-v /data/clickhouse/config/users.xml:/etc/clickhouse-server/users.xml \
clickhouse/clickhouse-server:latest

如何访问 :

  • 端口号 : ClickHouse 上文中提到了3个端口 :
    • 9000:TCP 端口,用于 Clickhouse 客户端连接。
    • 8123:TCP 端口,用于 Clickhouse WebUI 连接。
    • 8124:TCP 端口,用于 Clickhouse 的 HTTP API 连接。
  • UI 访问界面 : zhuanlan.zhihu.com/p/355043330
    • 上述文章里面推荐了5种方式,我本人不太熟,这里选择 tabix 进行访问
java 复制代码
// S1 : 运行容器
docker run -d -p 8080:80 spoonest/clickhouse-tabix-web-client

- PS : 也可以设置用户密码连接
docker run -d -p 8080:80 -e USER='myuser' -e PASSWORD='mypass' spoonest/clickhouse-tabix-web-client

此处通过8080访问即可 :

Tabix 界面详情

四. 基础使用

这里我只展示我学习过程中记录的几个 SQL :

DDL 语句

SQL 复制代码
-- 创建数据库 
CREATE DATABASE IF NOT EXISTS test_database;

-- 删除数据库
DROP database test_database;'

-- 创建一张表
CREATE TABLE test_database.user (
    id Int32,
    name String,
    age Int32
) ENGINE = MergeTree() PRIMARY KEY id ORDER BY id

-- 删除一张表
DROP table if exists test_database.user;

-- 添加字段
alter table test_database.user add column `remark` String DEFAULT '' COMMENT '备注';

-- 修改字段
alter table test_database.user modify column `remark` Nullable(String) DEFAULT NULL COMMENT '备注';

-- 删除字段
alter table test_database.user drop column `remark`;

到这里一个表就创建完成了。

增删改查

sql 复制代码
-- 插入一条数据
INSERT INTO test_database.user (*) VALUES (1, '测试创建一条数据', 23) ;

-- 删除数据
ALTER TABLE test_database.user DELETE WHERE id = 1;

-- 修改数据
ALTER table test_database.user update name = '测试修改数据' where id = 1

-- 查询数据 (不深入了,按照文档基本上兼容大部分 SQL 语法)
select * from test_database.user
select * from test_database.user where id = 1

更详细的可以参考文档 :clickhouse.com/docs/zh/sql...

总结

对于列数据库,由于使用不算很深入,没办法说出太多的原理。

简单来说 ,其性能优异,根本原因在于处理的列更少了,而且可以借助压缩和向量算法来实现快速处理。

而在使用上, 既可以自己存储数据,又可以作为其他数据库的映射来使用。

最后,这一篇不涉及到 Java 的调用,下一篇会写出来,欢迎关注。

参考文档

juejin.cn/post/724918...

blog.csdn.net/qq_41070393...

相关推荐
何事驚慌几秒前
2024/10/5 数据结构打卡
java·数据结构·算法
结衣结衣.几秒前
C++ 类和对象的初步介绍
java·开发语言·数据结构·c++·笔记·学习·算法
TJKFYY3 分钟前
Java.数据结构.HashSet
java·开发语言·数据结构
kylinxjd4 分钟前
spring boot发送邮件
java·spring boot·后端·发送email邮件
OLDERHARD12 分钟前
Java - MyBatis(上)
java·oracle·mybatis
杨荧13 分钟前
【JAVA开源】基于Vue和SpringBoot的旅游管理系统
java·vue.js·spring boot·spring cloud·开源·旅游
Code成立17 分钟前
1、深入理解Redis线程模型
数据库·redis·bootstrap
缘友一世2 小时前
macos安装mongodb
数据库·mongodb·macos
zaim12 小时前
计算机的错误计算(一百一十四)
java·c++·python·rust·go·c·多项式
2401_857439693 小时前
Spring Boot新闻推荐系统:用户体验优化
spring boot·后端·ux