1、ClickHouse入门:列式存储与OLAP概念、ClickHouse核心特性、安装部署与启动
1.1 从OLTP到OLAP:为什么我们需要ClickHouse?
做量化分析的朋友,一定对数据库不陌生。我们平时用的MySQL、PostgreSQL,都属于OLTP(在线事务处理)数据库。它们擅长处理「张三给李四转了100块钱」这种小数据量的增删改查。
但量化分析不一样。我们面对的是海量的历史行情数据——每秒几千笔的Tick数据,一天下来就是几亿行。你想想看,用MySQL去跑一个「过去三年所有股票的平均波动率」的查询,那得等到猴年马月?
这就是OLAP(在线分析处理)的用武之地。OLAP数据库专门为「读多写少、大范围扫描、聚合计算」而生。ClickHouse,就是OLAP领域的佼佼者。
我个人习惯把ClickHouse比作「数据库界的法拉利」——它很快,但需要你懂它的脾气。
1.2 列式存储:ClickHouse的杀手锏
传统数据库是行式存储的。什么意思呢?就是把一整行的数据挨个存起来:
行1: 2024-01-01, 000001.SH, 开盘价, 3000.12
行2: 2024-01-01, 000001.SH, 最高价, 3010.45
行3: 2024-01-01, 000001.SH, 最低价, 2995.78
...
ClickHouse用的是列式存储。它把每一列单独存:
日期列: 2024-01-01, 2024-01-01, 2024-01-01, ...
代码列: 000001.SH, 000001.SH, 000001.SH, ...
价格列: 3000.12, 3010.45, 2995.78, ...
这样做的好处太明显了。做量化分析时,我们经常只关心某几列——比如「收盘价」和「成交量」。列式存储只需要读取这两列的数据,其他列碰都不碰。这在行式存储里是做不到的,你必须把整行都读出来。
核心优势:列式存储让ClickHouse在聚合查询上比MySQL快100倍以上。我在项目中遇到过,同样的「计算过去一年日均成交量」的SQL,MySQL跑了3分钟,ClickHouse只用了0.3秒。
1.3 ClickHouse核心特性一览
除了列式存储,ClickHouse还有几个让我爱不释手的特性:
- 向量化执行:CPU一次处理一批数据,而不是一条一条处理。说白了就是「批量操作」,效率极高。
- 数据压缩:列式存储天然适合压缩。同一列的数据类型相同,压缩比能达到5:1甚至10:1。我有个量化数据表,原始数据1TB,压缩后只有120GB。
- 分布式架构:可以轻松扩展到几十台机器。数据自动分片,查询自动并行。
- 实时写入:支持每秒百万级的写入速度。做量化回测时,实时行情数据可以毫秒级入库。
- SQL兼容:大部分标准SQL都能用,学习成本很低。
小提示:ClickHouse不支持事务,也不支持高频的更新和删除。它天生就是为「一次写入,多次读取」的场景设计的。如果你需要频繁更新单条数据,那ClickHouse不适合你。
1.4 安装部署:三种方式任你选
嗯,这里要注意。ClickHouse的安装方式有好几种,我按推荐程度排个序:
方式一:Docker安装(最推荐)
我个人最喜欢这种方式,干净利落,不污染宿主机环境。
# 拉取镜像
docker pull clickhouse/clickhouse-server:latest
# 启动服务
docker run -d --name clickhouse-server \
-p 8123:8123 \
-p 9000:9000 \
-v /data/clickhouse:/var/lib/clickhouse \
clickhouse/clickhouse-server:latest
启动后,用客户端连接:
docker exec -it clickhouse-server clickhouse-client
方式二:APT/YUM安装(适合生产环境)
如果你用的是Ubuntu或CentOS,可以直接用包管理器安装:
# Ubuntu
sudo apt-get install clickhouse-server clickhouse-client
# CentOS
sudo yum install clickhouse-server clickhouse-client
方式三:二进制包安装(适合离线环境)
下载tar.gz包,解压就能用。我曾经在某个内网环境部署过,没有网络,只能用这种方式。
tar -xzf clickhouse-*.tar.gz
cd clickhouse
./clickhouse-server start
1.5 启动与验证
启动服务后,我们验证一下是否正常工作:
# 查看服务状态
systemctl status clickhouse-server
# 连接客户端
clickhouse-client
# 执行一个简单查询
SELECT 1 + 1;
如果返回 2,恭喜你,ClickHouse已经跑起来了。
避坑指南:我曾经在启动时遇到过端口冲突。ClickHouse默认使用8123(HTTP接口)和9000(原生协议接口)。如果你本地已经跑了其他服务占用了这些端口,记得在配置文件中修改。
1.6 知识体系总览
下面这张图,帮你快速理清本章的核心脉络:
1.7 量化场景初体验
装好ClickHouse后,我们来创建一个简单的量化数据表:
CREATE TABLE stock_ticks (
symbol String,
trade_date Date,
open Float64,
high Float64,
low Float64,
close Float64,
volume UInt64
) ENGINE = MergeTree()
ORDER BY (symbol, trade_date);
这个表结构很直观。股票代码、日期、开盘价、最高价、最低价、收盘价、成交量。MergeTree是ClickHouse最常用的表引擎,专门为时序数据优化。
插入几条测试数据:
INSERT INTO stock_ticks VALUES
('000001.SH', '2024-01-02', 3000.12, 3010.45, 2995.78, 3005.23, 123456789),
('000001.SH', '2024-01-03', 3005.23, 3020.11, 2998.56, 3015.89, 98765432);
然后试试查询:
SELECT
symbol,
avg(close) as avg_close,
sum(volume) as total_volume
FROM stock_ticks
WHERE trade_date >= '2024-01-01'
GROUP BY symbol;
看到结果了吗?这就是ClickHouse的威力。几行SQL,就能完成海量数据的聚合分析。
我的经验:刚开始用ClickHouse时,我习惯把MySQL的建表习惯带过来——加索引、加约束。后来发现完全没必要。ClickHouse的MergeTree引擎自带排序和分区,你只需要指定ORDER BY的字段,查询性能就非常好了。
好了,第一章的内容就到这里。ClickHouse的安装和基本概念我们已经搞定了。记住,列式存储是它的灵魂,OLAP是它的战场。后面的章节,我们会深入MergeTree引擎、数据分区、物化视图等高级特性,一步步把它变成量化分析的利器。