
ClickHouse 实用指南:让你的数据分析飞起来
如果你在做项目的时候,遇到了海量数据分析的问题,传统的 MySQL 查个几千万条数据就卡得要命。但如果是 ClickHouse,真的会被它的速度震撼到。
## ClickHouse 是个啥?
简单来说,ClickHouse 是一个**开源的列式数据库**,专门用来做实时数据分析。你可以理解为它是一个超快的数据仓库,特别擅长处理大量数据的查询和分析。
https://appstore.lazycat.cloud/#/shop/detail/io.zeroc.app.clickhouse
## 快速上手
应用安装后,打开就是功能页面

资源管理器面板 (Explorer),可以浏览数据库的结构。它内置了一些数据库:
INFORMATION_SCHEMA: 许多 SQL 数据库中都有的标准模式,包含关于数据库对象(如表、列和数据类型)的元数据。
system: ClickHouse 中的另一个系统数据库,包含内部表和关于服务器状态的信息

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

SQL QUERY (SQL 查询): 这是页面最重要的部分。它是一个编辑器,您可以在这里直接编写和执行 SQL 查询,向 ClickHouse 服务器发送 SELECT、INSERT、CREATE 或其他 SQL 语句

创建一个用户行为分析的表:
```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');
```

试试查询:
```sql
-- 按设备类型统计事件数量
SELECT device, count() as event_count
FROM user_events
GROUP BY device;
```

### 选择合适的表引擎
**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;
```

### 为什么它这么快?
传统数据库(比如 MySQL)是按行存储数据的:
```
姓名 年龄 城市
张三 25 北京
李四 30 上海
王五 28 深圳
```
而 ClickHouse 是按列存储的:
```
姓名列: [张三, 李四, 王五]
年龄列: [25, 30, 28]
城市列: [北京, 上海, 深圳]
```
这样做的好处是:
- 查询时只读取需要的列,大大减少IO
- 同一列的数据类型相同,压缩效果更好
- 适合做聚合计算(求和、平均值等)
**适合的场景:**
- 日志分析(服务器日志、用户行为日志)
- 实时报表和数据看板
- 时间序列数据分析
- 大数据量的统计分析
-
**不太适合的场景:**
- 频繁的单条记录增删改
- 需要事务支持的场景
- 小数据量的简单查询
## 写在最后
ClickHouse 适合在处理大数据量分析的时候。
如果你也在做数据分析相关的工作,强烈建议试试 ClickHouse,相信不会让你失望的。
有问题的话欢迎一起讨论~
此 App 尚未收到足够的评分或评论,无法显示评论列表。