[SQL系列]从零开始学Clickhouse

起因

听说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_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;
相关推荐
难以触及的高度20 分钟前
mysql中between and怎么用
数据库·mysql
Jacky(易小天)34 分钟前
MongoDB比较查询操作符中英对照表及实例详解
数据库·mongodb·typescript·比较操作符
Karoku0661 小时前
【企业级分布式系统】ELK优化
运维·服务器·数据库·elk·elasticsearch
莫叫石榴姐1 小时前
数据科学与SQL:组距分组分析 | 区间分布问题
大数据·人工智能·sql·深度学习·算法·机器学习·数据挖掘
小技与小术2 小时前
数据库表设计范式
数据库·mysql
安迁岚2 小时前
【SQL Server】华中农业大学空间数据库实验报告 实验三 数据操作
运维·服务器·数据库·sql·mysql
安迁岚2 小时前
【SQL Server】华中农业大学空间数据库实验报告 实验九 触发器
数据库·sql·mysql·oracle·实验报告
Loganer3 小时前
MongoDB分片集群搭建
数据库·mongodb
LKID体3 小时前
Python操作neo4j库py2neo使用之创建和查询(二)
数据库·python·neo4j
刘大浪3 小时前
后端数据增删改查基于Springboot+mybatis mysql 时间根据当时时间自动填充,数据库连接查询不一致,mysql数据库连接不好用
数据库·spring boot·mybatis