ClickHouse 实用指南:让你的数据分析飞起来

天天

发布于299天前
龙猫也是猫
如果你在做项目的时候,遇到了海量数据分析的问题,传统的 MySQL 查个几千万条数据就卡得要命。但如果是 ClickHouse,真的会被它的速度震撼到。

## ClickHouse 是个啥?

简单来说,ClickHouse 是一个**开源的列式数据库**,专门用来做实时数据分析。你可以理解为它是一个超快的数据仓库,特别擅长处理大量数据的查询和分析。


https://appstore.lazycat.cloud/#/shop/detail/io.zeroc.app.clickhouse

## 快速上手

应用安装后,打开就是功能页面

![image.png](https://dl.playground.lazycat.cloud/guidelines/496/e1b343dd-0146-4bd8-8716-47a83b19af64.png "image.png")

资源管理器面板 (Explorer),可以浏览数据库的结构。它内置了一些数据库:

INFORMATION_SCHEMA: 许多 SQL 数据库中都有的标准模式,包含关于数据库对象(如表、列和数据类型)的元数据。

system: ClickHouse 中的另一个系统数据库,包含内部表和关于服务器状态的信息

![image.png](https://dl.playground.lazycat.cloud/guidelines/496/ba54389a-d505-40e9-9f40-acd3d95d16f1.png "image.png")

右侧区域,是写sql语句的地方

![image.png](https://dl.playground.lazycat.cloud/guidelines/496/70c585a5-9c5a-4e9a-950e-a93ac2154ca1.png "image.png")
SQL QUERY (SQL 查询): 这是页面最重要的部分。它是一个编辑器,您可以在这里直接编写和执行 SQL 查询,向 ClickHouse 服务器发送 SELECT、INSERT、CREATE 或其他 SQL 语句

![image.png](https://dl.playground.lazycat.cloud/guidelines/496/440f322e-045f-4b8a-ba71-870d197f2659.png "image.png")

创建一个用户行为分析的表:

```sql
-- 创建数据库
CREATE DATABASE user_analytics;

-- 使用数据库
USE user_analytics;

-- 创建用户行为表
CREATE TABLE user_events (
    user_id UInt32,
    event_time DateTime,
    event_type String,
    page_url String,
    device String
) ENGINE = MergeTree()
ORDER BY (user_id, event_time);
```

插入一些测试数据:
```sql
INSERT INTO user_events VALUES
(1001, '2024-01-15 10:30:00', 'page_view', '/home', 'mobile'),
(1001, '2024-01-15 10:35:00', 'click', '/product/123', 'mobile'),
(1002, '2024-01-15 11:00:00', 'page_view', '/home', 'desktop'),
(1002, '2024-01-15 11:05:00', 'purchase', '/checkout', 'desktop'),
(1003, '2024-01-15 12:00:00', 'page_view', '/about', 'mobile');
```

![image.png](https://dl.playground.lazycat.cloud/guidelines/496/f1c749a8-3437-464f-9b42-38ca30854b99.png "image.png")
试试查询:
```sql
-- 按设备类型统计事件数量
SELECT device, count() as event_count
FROM user_events
GROUP BY device;
```

![image.png](https://dl.playground.lazycat.cloud/guidelines/496/2d35987f-c430-47fb-bd5a-794c152fa383.png "image.png")


### 选择合适的表引擎

**MergeTree(最常用):**
```sql
CREATE TABLE events (
    date Date,
    user_id UInt32,
    action String
) ENGINE = MergeTree()
PARTITION BY toYYYYMM(date)  -- 按月分区
ORDER BY (user_id, date);    -- 主键排序
```

**ReplacingMergeTree(去重):**
```sql
CREATE TABLE user_profiles (
    user_id UInt32,
    name String,
    email String,
    updated_at DateTime
) ENGINE = ReplacingMergeTree(updated_at)  -- 用更新时间去重
ORDER BY user_id;
```
 
**利用分区剪枝:**
```sql
-- 好的查询,利用了分区
SELECT count() FROM events 
WHERE date >= '2024-01-01' AND date < '2024-02-01';

-- 不好的查询,扫描全表
SELECT count() FROM events 
WHERE toYear(date) = 2024;
```
 
查看表大小:
```sql
SELECT table, 
       formatReadableSize(sum(bytes)) as size,
       sum(rows) as rows
FROM system.parts 
GROUP BY table;
```

![image.png](https://dl.playground.lazycat.cloud/guidelines/496/b483fd82-aa51-4181-9d61-434de2670da1.png "image.png")
 
### 为什么它这么快?

传统数据库(比如 MySQL)是按行存储数据的:
```
姓名    年龄    城市
张三    25     北京
李四    30     上海
王五    28     深圳
```

而 ClickHouse 是按列存储的:
```
姓名列: [张三, 李四, 王五]
年龄列: [25, 30, 28]  
城市列: [北京, 上海, 深圳]
```

这样做的好处是:
- 查询时只读取需要的列,大大减少IO
- 同一列的数据类型相同,压缩效果更好
- 适合做聚合计算(求和、平均值等)


**适合的场景:**
- 日志分析(服务器日志、用户行为日志)
- 实时报表和数据看板
- 时间序列数据分析
- 大数据量的统计分析
-
**不太适合的场景:**
- 频繁的单条记录增删改
- 需要事务支持的场景
- 小数据量的简单查询



## 写在最后

ClickHouse 适合在处理大数据量分析的时候。


如果你也在做数据分析相关的工作,强烈建议试试 ClickHouse,相信不会让你失望的。

有问题的话欢迎一起讨论~

评论

0

暂无评论

说点什么呢~
收藏
0
0
0