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 知识体系总览

下面这张图,帮你快速理清本章的核心脉络:

ClickHouse入门 OLAP vs OLTP 列式存储原理 核心特性 安装部署 启动与验证 量化分析场景 Docker / APT / 二进制 systemctl / clickhouse-client 行情数据 / 回测分析 图:ClickHouse入门知识体系

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引擎、数据分区、物化视图等高级特性,一步步把它变成量化分析的利器。

专注资料整理