[SQL系列]从零开始学Clickhouse

server/2025/1/16 5:44:09/

起因

        听说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/server/28822.html

相关文章

python生成随机字符串

随机字符的场景大致有以下场景: 1.产生随机字符串 无数字 2.产生随机长度的字符串 无数字、有数字 3.产生随机手机号 4.产生随机n位的数字 5.产生随机n以内的数字 随机使用的两种思路如下: 一:使用random.randint(0,n) 我们有一个包含…

Python中生成随机数,探索随机数的无限可能

在Python中,生成随机数是一种常见的需求,无论是在模拟、游戏、密码生成还是数据科学中。Python提供了几个内置的库来生成随机数,其中最常用的是random模块。此外,对于更高级的用途,如密码学,我们还可以利用…

基于python的天气网站数据爬取和可视化分析项目

基于python的天气网站数据爬取和可视化分析项目 2024.03-2024.04项目职责:策划者和执行者 项目地址:项目描述:本项目的目的是为了通过爬虫技术来爬取中国气象网的天气数据,并且使用pandas,pyecharts进行 数据可视化,分析…

踏上R语言之旅:解锁数据世界的神秘密码(五)

线性与非线性模型及R使用 文章目录 线性与非线性模型及R使用一、数据的分类与模型选择1.变量的取值类型 二、广义线性模型广义线性模型概述Logistic模型 总结 一、数据的分类与模型选择 1.变量的取值类型 因变量记为y,解释变量记为x1,x2,… 因变量y一般…

聚类分析:使用R语言对Iris数据集进行K均值聚类

引言 聚类分析是一种常用的无监督学习技术,旨在将数据集中的样本分成具有相似特征的组。K均值聚类是其中一种常见的方法,它通过将数据点划分为K个簇,并使每个数据点与其所属簇的中心点距离最小化来实现聚类。本文将介绍如何使用R语言执行K均…

【mysql】mysql中的数据类型知多少?

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

【STM32+HAL】读取电池电量

一、准备工作 有关CUBEMX的初始化配置,参见我的另一篇blog:【STM32HAL】CUBEMX初始化配置 有关定时器触发ADC模式配置,详见【STM32HAL】ADC采集波形实现 有关软件触发ADC模式配置,详见【STM32HAL】三轴按键PS2摇杆 二、所用工具…

实验报告1 小费数据分析(包含描述性-数据可视化)

实验报告1 小费数据分析 实验内容 小费数据分析 实验思路:读取数据-数据预处理-探索性数据分析(描述性统计分析)-分组分析-可视化分析-特征工程 实验环境工具:VS code 编程语言:python 实验原理: (用到pandas库的哪些基本概念和方法?这些方法分别是什么作用?) 在上述…