[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_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.mzph.cn/pingmian/4656.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

利用机器学习进行图像分类:以TensorFlow和Keras为例

当使用 TensorFlow 和 Keras 进行图像分类时,常用的方法是使用卷积神经网络(Convolutional Neural Network,CNN)。以下是一个简单的图像分类示例,使用 TensorFlow 和 Keras 来训练一个 CNN 模型对手写数字进行分类。 …

JUC-并发编程19-定时任务定时线程池-ScheduledThreadPoolExecutor

1、结构图 2、初识 ScheduledThreadPoolExecutor用来处理延时任务或定时任务。 流程如下: 2.1 定时任务分为四种 如下: 未来执行一次的任务,无返回值; 未来执行一次的任务,有返回值; 未来按固定频率重复…

Linux基础 -- 跨平台原子操作:ARM 汇编与 C 语言集成

1. 汇编语言实现 首先,你需要用 ARM 汇编语言编写比较并交换的功能。这里以 ARMv8 架构为例,因为它直接支持 64 位操作,并且可以较容易地适配 32 位。 // cas.S // 实现 32 位和 64 位的比较并交换函数 .text .global cas32 .global cas64/…

安川YASKAWA机器人FS100控制箱维修全攻略

本文将一起探讨安川机器人控制箱维修和YASKAWA机械手FS100控制柜故障,从故障诊断到维修技巧。注意,在安川机械臂控制器FS100维修过程中,遇到复杂的问题,不要犹豫,及时联系子锐机器人,让您的机器人重获新生&…

chrome 安装devtools

chrome 安装devtools 下载安装 链接:https://github.com/vuejs/devtools 选择对应版本: 安装yarn 下载 npm install -g yarn --registryhttps://registry.npmmirror.com进入下载的目录安装依赖 yarn install --registryhttps://registry.npmmirror.…

一篇了解reactor框架特性

一篇了解reactor框架特性 本文档的一些典型的名词如下: Publisher(发布者)、Subscriber(订阅者)、Subscription(订阅 n.)、subscribe(订阅 v.)。event/signal&#xff0…

抖音 通用交易系统 下单 密钥生成

已PHP为例 前提提条件 必须在 linux 系统中 生成 准备工作 在小程序中 生成应用公匙 把生成的公匙 复制 在linux 系统中 创建文件 private_key.pem 并将公匙粘贴 接下来打开命令 执行命令即可 openssl genrsa -out private_key.pem 2048 rsa -in private_key.pem -pubo…

分治策略 --- 快排归并

目录 分治-快排 一、颜色分类 二、排序数组 三、数组中的第K个最大元素 四、库存管理 分治-归并 一、排序数组 二、交易逆序对的总数 三、计算右侧小于当前元素的个数 四、翻转对 分治是一种思想,也就是将大问题分解成小问题,一直分到小问题可…

【Camera KMD ISP SubSystem笔记】CAM SYNC与DRQ②

DRQ的作用: DRQ负责调度管理pipeline里的node处理逻辑(通过node之间的dependency依赖机制) 利用多线程并行处理Pipeline中并行的node,加快处理速度 DRQ运转流程: DRQ先告诉node fill dependency, 此时seq id 为0…

如何优雅的实现 iframe 多层级嵌套通讯

前言 在前端开发项目中,不可避免的总会和 iframe 进行打交道,我们通常会使用 postMessage 实现消息通讯。 如果存在下面情况: iframe 父子通讯iframe 同层级通讯iframe 嵌套层级通讯 当面对这种复杂的情况的时候,通讯不可避免…

Unity 物体触碰事件监听

声明委托 public delegate void MyDelegate(Collider trigger); C# 委托(Delegate) | 菜鸟教程 (runoob.com)https://www.runoob.com/csharp/csharp-delegate.html 定义委托 public MyDelegate onTriggerEnter; public MyDelegateonTriggerStay; pub…

用来传输文件的协议-FTP

一.FTP协议--文件传输协议 1.了解FTP协议 (1)FTP服务是用来传输文件的协议 FTP(File Transfer Protocol,文件传输协议)是TCP/IP协议组中的协议之一,用于互联网上的控制文件的双向传输。是传输文件到Linu…

《Fundamentals of Power Electronics》——全桥型隔离降压转换器

以下是关于全桥型隔离降压转换器的相关知识点: 全桥变压器隔离型降压转换器如下图所示。 上图展示了一个具有二次侧绕组中心抽头的版本,该电路常用于产生低输出电压。二次侧绕组的上下两个绕组可以看作是两个单独的绕组,因此可以看成是具有变…

Internal server error: [less] Unrecognised input

我之前查了资料,网上有的人说是 less 的配置不正确(这种问题引起的可以查找其他博客看),但是后面经过我慢慢的查找,还有一种可能,就是 less 的写法不对,下面我来解释一下我的错误和处理过程 在…

kaggle无法注册怎么办

在浏览kaggle网站,或者是参加kaggle竞赛时,常常会遇到需要登陆kaggle账号的情况。而在注册时,却发现无论如何也无法弹出人机识别的验证码,导致无法注册成功。本文会手把手的讲解一种注册kaggle的方法(edge浏览器&#…

安装依赖报错前端安装某个依赖安装不上可能是node版本过高 升级或者降低node版本方式

安装依赖报错安装某个依赖安装不上可能是node版本过高 升级或者降低node版本方式 安装某个依赖安装不上 或者node版本过高 升级或者降低node版本 收藏关注一下吧 开发中难免总会需要切换node版本 需要的时候在找麻烦 主页 中还有更多干货分享

分享开放原子AtomGit开源协作平台评测报告

AtomGit平台的总体介绍 开放原子开源基金会是致力于推动全球开源事业发展的非营利机构,于 2020 年 6 月在北京成立,由阿里巴巴、百度、华为、浪潮、360、腾讯、招商银行等多家龙头科技企业联合发起。目前有三个主要机构设置,技术监督委员会&…

You need know something from Xcode 9

xcode 9 一些快捷的功能使用介绍 首先是弹框 目前发现弹框中的提取方法等功能存在一些问题,期待后续的版本能解决这些问题,弹框里面主要包含跳转变量或者方法的跳转、快捷帮助、折叠方法、重命名方法名称、提取方法等功能 笔者觉得rename功能比较好用&…

【新手入门】Git的使用方法,上传自己的项目到GitHub上

Git新手教程 一、Git下载安装二、初始化设置1.网端设置2.用户设置 三、开始上传自己项目1.创建新文件夹,克隆项目地址2.上传文件3.成功运行并上传的界面 报错1.fatal: unable to access https://github.com/ssrzero123/STF-YOLO.git/: error setting certificate fi…

NDK 编译(二)—— NDK 编译与集成 FFmpeg

NDK 编译系列文章共三篇,目录如下: NDK 编译(一)—— Linux 知识汇总 NDK 编译(二)—— NDK 编译与集成 FFmpeg NDK 编译(三)—— CMake 原生构建工具 在使用 NDK 进行音视频开发时&…