[SQL系列]从零开始学Clickhouse

devtools/2024/10/17 16:41:58/

起因

        听说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的。

        

  1. 安装 Docker:确保你的系统上安装了 Docker。可以从 Docker 官网 下载并安装适合你操作系统的版本。(如何已经安装好了docker这一步可以跳过)

  2. 切换国内源:在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"]

    这一步懂得科学上网或者拉镜像的可以跳过。

  3. 拉取 ClickHouse 镜像:打开命令行工具,使用以下命令拉取最新的 ClickHouse 镜像。

    docker pull clickhouse/clickhouse-server
    
  4. 运行 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 将本地数据目录挂载到容器中。

  5. 连接到 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_tableQuery 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;

http://www.ppmy.cn/devtools/28599.html

相关文章

刷代码随想录有感(52):用数组最大值及其两侧构造最大二叉树

题干&#xff1a; 代码&#xff1a; class Solution { public:TreeNode* constructMaximumBinaryTree(vector<int>& nums) {if(nums.size() 1)return new TreeNode(nums[0]);int maxvalue INT_MIN;int maxindex;for(int i 0; i < nums.size(); i){if(nums[i] …

Pandas数据可视化 - Matplotlib、Seaborn、Pandas Plot、Plotly

可视化工具介绍 让我们一起探讨Matplotlib、Seaborn、Pandas Plot和Plotly这四个数据可视化库的优缺点以及各自的适用场景。这有助于你根据不同的需求选择合适的工具。 1. Matplotlib 优点: 功能强大&#xff1a;几乎可以用于绘制任何静态、动画和交互式图表。高度可定制&a…

分布式与一致性协议之Raft算法与一致哈希算法(一)

Raft算法 Raft与一致性 有很多人把Raft算法当成一致性算法&#xff0c;其实它不是一致性算法而是共识算法&#xff0c;是一个Multi-Paxos算法&#xff0c;实现的是如何就一系列值达成共识。并且&#xff0c;Raft算法能容忍少数节点的故障。虽然Raft算法能实现强一致性&#x…

Swift - 可选项(Optional)

文章目录 Swift - 可选项&#xff08;Optional&#xff09;1. 可选项&#xff08;Optional&#xff09;2. 强制解包&#xff08;Forced Unwrapping&#xff09;3. 判断可选项是否包含值4. 可选项绑定&#xff08;Optional Binding&#xff09;5. 等价写法6. while循环中使用可选…

LabVIEW飞机机电系统综合测试平台

LabVIEW飞机机电系统综合测试平台 在现代航空领域&#xff0c;机电系统的准确性与可靠性对飞行安全至关重要。针对飞机机电管理计算机&#xff08;UMC&#xff09;复杂度增加、测试覆盖率低、效率不高等问题&#xff0c;开发了一套基于LabVIEW的机电系统综合测试平台。平台通过…

推动数字化智变发展 锐捷网络保持行业领先

今天,数字经济迈入高质量发展新阶段,已成为世界经济竞争格局的战略高地。云、AI、5G等新技术与产业深度融合的“数智时代”下,网络基础设施至关重要。作为行业领先的网络基础设施及解决方案提供商,锐捷网络(301165)在持续发展中推动数字化智变。 行业领先 行稳致远 自成立以来…

数据结构与算法-基于回溯的全排列问题

全排列问题 回溯解决全排列问题 [1,2,3];穷举&#xff0c;全排列问题 每次选择一个数子&#xff0c;利用selected记录已选择的 首先通过循环去遍历每个可能的选择&#xff0c;选择一个数字后&#xff0c;记录选择&#xff0c;递归进行下一次选择 #nums:给定的数组,selected&a…

kerberos-hive-dbeaver问题总结

一、kerberos安装windows客户端 1、官方下载地址 http://web.mit.edu/kerberos/dist/ 2、环境变量配置 下载msi安装包&#xff0c;无需重启计算机&#xff0c;调整环境变量在jdk的前面&#xff0c;尽量靠前&#xff0c;因为jdk也带了kinit、klist等命令 C:\Program Files\…