起因
听说2024年开始金三银四了,所以我和我的小伙伴们也抱着再去拿一些Offer的准备。但是一上来就蒙了,对方问,听说你对数据库非常熟悉,那就说说ClickHouse吧。
这怎么就不按套路出牌呢?不一般就问Mysql的InnoDB嘛。
赶紧回来学起来,什么是ClickHouse?
什么是ClickHouse
ClickHouse 是一个用于在线分析处理(OLAP)的列式数据库管理系统(DBMS)。它由俄罗斯的Yandex公司开发,专门设计用于快速查询海量数据集。ClickHouse 的核心特点是高性能、可扩展性和实时数据分析能力。它具有以下几个特性:
列式存储
ClickHouse 使用列式存储,这意味着数据是按列而不是按行存储的。这种存储方式对于分析查询非常有利,因为它可以显著减少磁盘I/O和内存使用,同时提高数据压缩率。列式存储允许ClickHouse在执行查询时只读取相关的列,而不是整行数据,从而加快查询速度。
高性能
ClickHouse 被设计为尽可能快地处理查询。它支持并行和分布式处理,可以在多个服务器上分配查询负载。ClickHouse 还包括一系列优化的数据存储和处理算法,以及一个高度优化的查询执行引擎。
SQL支持
ClickHouse 支持 SQL 作为查询语言,这使得熟悉 SQL 的用户可以轻松地使用它。ClickHouse 的 SQL 支持包括对标准查询、聚合、连接、窗口函数和其他高级分析功能的支持。
可扩展性和可靠性
ClickHouse 支持水平扩展,可以通过添加更多服务器来增加计算和存储能力。它还提供了数据复制和故障转移功能,确保系统的可靠性和数据的安全性。
ClickHouse能用来做什么
ClickHouse 适用于各种数据分析场景,包括:
1. Web分析
ClickHouse 可以用来存储和分析网站流量数据,包括页面浏览量、用户访问、点击率等。通过ClickHouse,可以快速查询特定时间段内的用户行为,从而优化网站设计和提高用户体验。
2. 广告网络和实时竞价
在广告网络中,ClickHouse 可以用来处理大量的广告展示和点击数据,支持实时竞价(RTB)系统。ClickHouse 的高性能查询允许广告平台快速做出决策,提高广告投放的效果。
3. 用户行为分析
ClickHouse 可以用来分析用户在移动应用或在线服务中的行为。例如,分析用户如何与不同功能互动,哪些功能最受欢迎,以及用户的留存率。
4. 金融分析
在金融服务中,ClickHouse 可以用来存储和分析交易数据、市场数据和历史价格。分析师可以使用ClickHouse来执行复杂的时间序列分析,预测市场趋势,或者进行风险评估。
5. IoT数据分析
ClickHouse 适用于存储和分析来自物联网设备的大量数据。例如,可以分析传感器数据来监测设备的性能,预测维护需求,或者优化能源消耗。
6. 时序数据分析
ClickHouse 支持高效的时间序列数据存储和分析。它可以用来监控服务器的性能指标,如CPU使用率、内存使用和磁盘I/O,以及分析这些指标随时间的变化。
7. 大规模数据仓库
ClickHouse 可以作为数据仓库使用,存储来自多个来源的大量数据。它支持数据复制和分布式查询,使得跨多个服务器分析数据变得简单高效。
8. 快速报告和仪表板
ClickHouse 可以与BI工具(如Grafana、Tableau等)集成,为业务分析师提供快速的数据报告和交互式仪表板。这使得非技术用户也能够轻松地从大量数据中提取洞察。
9. 实时数据流处理
ClickHouse 可以与流处理系统(如Kafka、RabbitMQ等)集成,支持实时数据流的分析。这使得ClickHouse能够处理连续的数据流,并支持近实时的决策制定。
10. 自定义数据分析应用
ClickHouse 的灵活性和性能使其成为开发自定义数据分析应用程序的理想选择。开发人员可以根据特定的业务需求构建高效的数据分析解决方案。
开始学习
安装学习环境
最后的学习环境莫过于直接在Docker里面进行配置了,因此下面的内容主要是讲如何在Docker里面配置好ClickHouse的。
-
安装 Docker :确保你的系统上安装了 Docker。可以从 Docker 官网 下载并安装适合你操作系统的版本。(如何已经安装好了docker这一步可以跳过)
-
**切换国内源:**在Windows操作系统中,修改C:/Users/用户/.docker/config.json文件,在里面加上下面的源。
"registry-mirrors": [ "http://hub-mirror.c.163.com", "https://mirror.ccs.tencentyun.com", "https://docker.mirrors.ustc.edu.cn", "https://registry.docker-cn.com" ]
这一步懂得科学上网或者拉镜像的可以跳过。
-
拉取 ClickHouse 镜像:打开命令行工具,使用以下命令拉取最新的 ClickHouse 镜像。
docker pull clickhouse/clickhouse-server
-
运行 ClickHouse 容器:拉取镜像后,可以使用以下命令来启动一个 ClickHouse 容器。
docker run -d --name some-clickhouse-server --ulimit nofile=262144:262144 clickhouse/clickhouse-server
这条命令会创建一个后台运行的 ClickHouse 容器。
--ulimit nofile=262144:262144
是为了提高系统文件描述符的限制,以确保 ClickHouse 可以打开足够的文件。当然这里也可以自己添加其他参数配置,比如-p 8123:8123
将容器的 8123 端口映射到宿主机的 8123 端口,-v [本地路径]:/var/lib/clickhouse
将本地数据目录挂载到容器中。 -
连接到 ClickHouse :容器启动后,你可以使用
docker exec
命令进入容器并使用clickhouse-client
命令行工具。docker exec -it some-clickhouse-server clickhouse-client
这会打开一个交互式的 ClickHouse 客户端,你可以在这里执行 SQL 查询。
增删改查
这些步骤就是很普通的CRUD,命令和MYSQL比较相似,跟POSTGRESQL就相差比较大了。
1. 创建数据库
CREATE DATABASE example;
2. 使用数据库
USE example;
3. 创建表
CREATE TABLE example_table (
id UInt32,
name String,
birthday Date
) ENGINE = MergeTree()
ORDER BY id;
这里使用 MergeTree
引擎,它是 ClickHouse 中最常用的存储引擎,适用于大多数场景。
4. 插入数据
INSERT INTO example_table (id, name, birthday) VALUES (1, 'Alice', '1990-01-01');
INSERT INTO example_table (id, name, birthday) VALUES (2, 'Bob', '1992-02-02');
INSERT INTO example_table (id, name, birthday) VALUES (3, 'Catherine', '1993-03-03');
这里得一条条执行,直接全部复制下去会执行失败的。
5. 查询数据
SELECT * FROM example_table;
得到如下结果
SELECT *
FROM example_table
Query id: dffeb873-14d6-4bf1-9972-218cf45ace3c
┌─id─┬─name──────┬───birthday─┐
1. │ 3 │ Catherine │ 1993-03-03 │
└────┴───────────┴────────────┘
┌─id─┬─name──┬───birthday─┐
2. │ 1 │ Alice │ 1990-01-01 │
└────┴───────┴────────────┘
┌─id─┬─name─┬───birthday─┐
3. │ 2 │ Bob │ 1992-02-02 │
└────┴──────┴────────────┘
3 rows in set. Elapsed: 0.003 sec.
这将返回表中的所有数据和列。
6. 条件查询
SELECT * FROM example_table WHERE name = 'Alice';
得到如下结果
Query id: cf45f273-e900-4235-a691-2eae99e79150
┌─id─┬─name──┬───birthday─┐
1. │ 1 │ Alice │ 1990-01-01 │
└────┴───────┴────────────┘
1 row in set. Elapsed: 0.003 sec.
7. 聚合查询
SELECT COUNT(*) FROM example_table;
SELECT COUNT(DISTINCT name) FROM example_table;
8. 分组查询
SELECT COUNT(*) FROM example_table GROUP BY birthday;
Query id: 16b44809-deb4-4715-8c4a-afbf3ddeceb0
┌─count()─┐
1. │ 1 │
2. │ 1 │
3. │ 1 │
└─────────┘
9. 更新数据
ClickHouse 不支持传统意义上的行级更新,但你可以通过 ALTER TABLE
语句更新数据。
ALTER TABLE example_table UPDATE name = 'Alice Smith' WHERE id = 1;
10. 删除数据
同样,ClickHouse 不支持传统意义上的行级删除,但你可以通过 ALTER TABLE
语句删除数据。
ALTER TABLE example_table DELETE WHERE id = 1;
Query id: a3f7d6e8-75dc-4c41-85a9-d338d6b516bc
┌─id─┬─name──────┬───birthday─┐
1. │ 3 │ Catherine │ 1993-03-03 │
└────┴───────────┴────────────┘
┌─id─┬─name─┬───birthday─┐
2. │ 2 │ Bob │ 1992-02-02 │
└────┴──────┴────────────┘
2 rows in set. Elapsed: 0.003 sec.
11. 使用索引
在创建表时,你可以指定索引列以优化查询性能。
CREATE TABLE indexed_table (
id UInt32,
name String,
birthday Date,
INDEX idx_name name TYPE minmax GRANULARITY 5
) ENGINE = MergeTree()
ORDER BY id;