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...

相关推荐
逸Y 仙X7 分钟前
文章二十:Elasticsearch高亮搜索完全指南
java·大数据·运维·elasticsearch·搜索引擎·全文检索
不甘先生11 分钟前
Go context 实战指南:从入门到生产级并发控制(架构师避坑手册)
开发语言·后端·golang
xmjd msup18 分钟前
mysql的分区表
数据库·mysql
Lyyaoo.18 分钟前
【JAVA Spring面经】Spring 事务失效情况
java·数据库·spring
MeAT ITEM23 分钟前
MySQL Workbench菜单汉化为中文
android·数据库·mysql
salipopl27 分钟前
Spring Boot 整合 Druid 并开启监控
java·spring boot·后端
dovens27 分钟前
PostgreSQL 中进行数据导入和导出
大数据·数据库·postgresql
IOT.FIVE.NO.127 分钟前
claude code desktop cowork报错解决和记录Workspace..The isolated Linux environment ...
linux·服务器·数据库
ShiJiuD66688899933 分钟前
JSP Cookie和Session
java·开发语言
Rick199336 分钟前
mysql 慢查询怎么快速定位
android·数据库·mysql