
1) 【一句话结论】采用时序数据库(如InfluxDB)存储原始Tick序列,结合列式数据库(如ClickHouse)构建聚合视图,表结构按时间分片,索引采用时间+字段复合索引,通过列存优化秒级/分钟级聚合,满足百万级写入与低延迟聚合需求。
2) 【原理/概念讲解】高频Tick数据属于时间序列,核心是时间维度与数据点的强关联。时序数据库(如InfluxDB)以时间戳为第一主键,天然支持按时间范围查询,写入时只需追加数据,适合高吞吐写入;列式数据库(如ClickHouse)通过列存存储数据,聚合查询时只需扫描相关列,计算效率高。例如,Tick数据包含时间戳、股票代码、价格、成交量等字段,时序数据库存储原始序列,列式数据库按时间聚合后生成分钟/秒级视图,减少实时查询的I/O开销。
3) 【对比与适用场景】
| 数据库类型 | 定义 | 核心特性 | 适用场景 | 注意点 |
|---|---|---|---|---|
| InfluxDB | 时序数据库,专为时间序列设计 | 时间序列为主键,写入高效,支持时间范围查询,支持数据压缩 | 原始Tick数据存储,按时间查询,高写入吞吐 | 不适合复杂关联查询,聚合需额外计算 |
| ClickHouse | 列式数据库,适合分析型查询 | 列存存储,聚合查询效率高,支持SQL,可扩展 | 秒级/分钟级聚合查询,数据仓库 | 写入延迟较高,适合批量聚合 |
4) 【示例】
measurement: stock_tick
tags: (symbol: "000001", exchange: "SSE")
fields: (price: 10.5, volume: 1000)
time: 2023-10-27T10:00:00Z
CREATE TABLE tick_agg (
symbol String,
time_to_part: toDateTime(timestamp, 'UTC'),
price Float64,
volume UInt64,
PRIMARY KEY (symbol, time_to_part)
) ENGINE = ReplacingMergeTree (symbol, time_to_part, price, volume)
PARTITION BY toYYYYMMDD(time_to_part)
ORDER BY (symbol, time_to_part)
SELECT symbol, avg(price) as avg_price, sum(volume) as total_volume
FROM tick_agg
WHERE time_to_part BETWEEN toDateTime('2023-10-27 09:30:00') AND toDateTime('2023-10-27 09:30:00') + interval 1 minute
GROUP BY symbol
5) 【面试口播版答案】
好的,针对高频Tick数据存储,核心方案是采用时序数据库(如InfluxDB)存储原始序列,结合列式数据库(如ClickHouse)构建聚合视图。具体来说,原始数据按时间分片存储,索引采用时间+字段复合索引,写入时通过批量写入提升吞吐;聚合查询时,列式数据库通过列存优化秒级/分钟级聚合,降低延迟。比如,InfluxDB负责每秒百万级写入,ClickHouse负责秒级聚合,最终满足业务需求。
6) 【追问清单】
7) 【常见坑/雷区】