时序数据库选型:InfluxDB、TimescaleDB、ClickHouse、DolphinDB对比

做高频做市系统,数据存储是个绕不开的坎。我见过不少团队,策略写得漂亮,结果一到回测阶段,数据查询慢得像蜗牛爬。说白了,选错数据库,后面全白干。

今天咱们就聊聊四个主流时序数据库:InfluxDB、TimescaleDB、ClickHouse、DolphinDB。我会从写入性能、压缩比、查询语法、生态成熟度四个维度,结合我踩过的坑,给你掰开揉碎了讲。

核心观点:没有银弹。每个库都有自己的脾气,选型要看你的具体场景——是做实时行情存储,还是历史回测分析,还是两者都要兼顾。

一、写入性能:谁扛得住千万级tick数据?

高频做市的数据写入,说白了就是一场「洪水」。每秒几万笔tick数据,峰值时甚至上百万。数据库能不能接住,直接决定了系统会不会崩。

数据库 单机写入吞吐 批量写入支持 我的实际体验
InfluxDB ~50万点/秒 HTTP批量写入 小规模场景够用,但并发一高就卡
TimescaleDB ~30万行/秒 PostgreSQL COPY 写入稳定,但受限于单机磁盘IO
ClickHouse ~200万行/秒 批量插入+异步写入 写入性能极强,我用来存全市场tick数据
DolphinDB ~500万点/秒 分区批量写入 写入速度最快,但配置复杂

我个人习惯,如果只是存几个合约的tick数据,InfluxDB够用。但如果你要存全市场5000+只股票的逐笔成交,那必须上ClickHouse或DolphinDB。

避坑指南:我曾经在InfluxDB上做过一次压力测试,写入线程开到16个,结果数据库直接OOM。后来发现是InfluxDB的写入缓存机制有问题——它会把所有未刷新的数据都放在内存里。解决办法是控制并发数,或者改用批量写入。

二、压缩比:存储成本能省多少?

高频数据有多占空间?我算过一笔账:一个交易所的Level2行情,一天大概产生50GB原始数据。一个月就是1.5TB。如果不压缩,光存储成本就能吃掉你一半的预算。

数据库 压缩算法 典型压缩比 备注
InfluxDB 自定义浮点压缩 3:1 ~ 5:1 对整数类型压缩效果一般
TimescaleDB 列式存储+pg压缩 4:1 ~ 8:1 依赖PostgreSQL原生压缩
ClickHouse LZ4 / ZSTD 6:1 ~ 12:1 ZSTD压缩比高,但解压慢
DolphinDB 列式+字典压缩 8:1 ~ 15:1 对重复值多的字段压缩效果极好

你想想看,同样的1TB原始数据,用InfluxDB存大概要200GB,用DolphinDB可能只要70GB。一年下来,存储成本差距可不是一星半点。

嗯,这里要注意:压缩比不是越高越好。压缩比高的算法,写入和查询时CPU开销也大。我建议你根据硬件配置来选——如果CPU够强,用ZSTD;如果CPU紧张,用LZ4。

三、查询语法:写起来顺不顺手?

做高频回测,查询语句写得顺不顺,直接影响开发效率。我见过有人为了查一个5分钟K线,写了50行SQL——这显然不合理。

InfluxDB:类SQL的Flux查询

from(bucket: "tick_data")
  |> range(start: -1h)
  |> filter(fn: (r) => r.symbol == "BTCUSDT")
  |> aggregateWindow(every: 1m, fn: mean)

Flux语法很灵活,但学习曲线陡。我刚开始用的时候,光是理解管道操作符就花了两天。而且Flux的调试工具不太友好,报错信息经常让人摸不着头脑。

TimescaleDB:标准SQL

SELECT time_bucket('1 minute', ts) AS bucket,
       symbol,
       AVG(price) AS avg_price
FROM ticks
WHERE symbol = 'BTCUSDT'
  AND ts > NOW() - INTERVAL '1 hour'
GROUP BY bucket, symbol;

TimescaleDB用的是标准SQL,对PostgreSQL用户来说零成本上手。我个人很喜欢这一点——毕竟SQL是通用语言,团队里随便拉个人都能写。

ClickHouse:类SQL但有限制

SELECT toStartOfMinute(ts) AS bucket,
       symbol,
       avg(price) AS avg_price
FROM ticks
WHERE symbol = 'BTCUSDT'
  AND ts > now() - INTERVAL 1 HOUR
GROUP BY bucket, symbol;

ClickHouse的SQL语法和标准SQL很像,但有一些限制——比如不支持UPDATE和DELETE(虽然最新版本有了轻量级删除)。如果你需要频繁修改数据,ClickHouse会让你很头疼。

DolphinDB:脚本语言+SQL混合

t = select avg(price) as avg_price from loadTable("dfs://tick", "ticks")
      where symbol=`BTCUSDT, ts > now() - 3600
      group by minute(ts) as bucket

DolphinDB的语法介于SQL和脚本之间。说实话,刚开始用的时候我挺不习惯的——它的函数命名和参数顺序跟主流数据库差别很大。但用熟了之后,你会发现它在处理复杂计算时特别顺手,比如计算VWAP、波动率这些指标。

注意:如果你团队里都是SQL高手,选TimescaleDB或ClickHouse更稳妥。DolphinDB虽然性能强,但招人是个问题——市面上会DolphinDB的工程师太少了。

四、生态成熟度:社区、工具、运维

选数据库不能只看性能,还得看生态。我见过太多项目,选了个冷门数据库,结果出了问题连个问的人都没有。

维度 InfluxDB TimescaleDB ClickHouse DolphinDB
社区活跃度
监控工具 Grafana原生支持 Grafana+pgAdmin Grafana+自研工具 自带Web界面
运维复杂度
文档质量 一般
第三方集成 丰富 丰富 中等

我个人建议:如果你团队小、运维能力弱,优先考虑InfluxDB或TimescaleDB。它们开箱即用,出了问题社区里一搜就有答案。ClickHouse虽然性能强,但运维门槛高——你得懂分布式架构、懂ZooKeeper、懂数据分片策略。

至于DolphinDB,嗯,它更像一个「封闭生态」。性能确实强,但文档写得像天书,社区里也没几个人。我建议除非你有专门的DolphinDB工程师,否则别轻易碰。

五、我的选型建议

说了这么多,到底怎么选?我根据实际项目经验,给你几个参考方案:

  • 小团队、单机部署、数据量<1TB/天:选InfluxDB。简单、够用、社区支持好。
  • 需要SQL兼容、团队有PostgreSQL经验:选TimescaleDB。性能稳定,生态成熟。
  • 大数据量、需要做复杂分析、有运维能力:选ClickHouse。写入快、压缩高、查询强。
  • 极致性能、有专门团队、愿意接受封闭生态:选DolphinDB。性能天花板最高,但代价也最大。

我的经验:我目前在用的方案是「ClickHouse + Kafka」的组合。Kafka负责缓冲写入流量,ClickHouse负责存储和查询。这个方案扛住了每天2TB的tick数据写入,查询延迟控制在100ms以内。当然,代价是运维团队有3个人专门盯着。

六、知识体系图

下面这张图展示了时序数据库选型的核心逻辑,你可以对照着看自己的场景适合哪个库:

时序数据库选型决策树 数据量 < 1TB/天? 是 → InfluxDB 否 → 继续判断 需要SQL兼容? 是 → TimescaleDB 否 → 继续判断 有专业运维团队? 是 → ClickHouse 否 → DolphinDB

这张图的核心逻辑很简单:先看数据量,再看团队能力。别一上来就追求最强性能,适合的才是最好的。


好了,时序数据库选型就聊到这儿。记住,没有完美的数据库,只有最适合你场景的数据库。选型之前,先搞清楚你的数据量、查询模式、团队能力,然后再做决定。