
1) 【一句话结论】
为存储超10TB制程数据并优化查询,核心方案是分库分表(按时间/批次分片键)+ 列式存储数据库(如ClickHouse),通过范围/列表分区减少扫描范围,复合B树索引覆盖查询条件,Redis缓存热点数据,平衡存储与查询性能。
2) 【原理/概念讲解】
老师会解释每个技术点:
类比:分区表像把大书按章节分册,查询时只翻对应章节;索引像书的目录,快速定位内容;缓存像速查手册,存常用结果。
3) 【对比与适用场景】
| 技术点 | 定义/特性 | 使用场景 | 注意点 |
|---|---|---|---|
| 分片键选择 | 时间分区键(按时间戳) vs 批次分区键(按批次ID) | 时间分区键:适合按时间范围查询(如最近7天数据),扩展性好;批次分区键:适合按批次追溯,数据集中。 | 时间分区键易导致数据倾斜(如某天数据量过大),需平衡分区粒度(如按周分区);批次分区键若批次数量多,分区数量可能过多。 |
| 列式存储 vs 关系型(处理JSONB) | 列式存储:数值列压缩率高(如时间戳、设备ID),但JSONB等复杂数据压缩效果有限,需预聚合或列式索引;关系型:JSONB原生支持,查询灵活但存储开销大。 | 列式存储:时序数据(如制程参数)的存储与查询性能;关系型:复杂数据结构(如工艺参数JSONB)的灵活查询。 | 列式存储需对JSONB字段做列式索引(如ClickHouse的JSON列式索引,配置CREATE INDEX idx_json_param ON process_data (process_param)),否则性能下降;关系型数据库对JSONB的更新操作较慢。 |
| B树索引 vs 哈希索引 | B树:树形结构,支持范围查询(如时间范围),维护成本高;哈希:哈希表,等值查询快(如查特定设备ID),不支持范围。 | B树:按时间范围、设备ID范围查询(如timestamp BETWEEN ...);哈希:查特定时间点数据(如timestamp = '2024-01-15 10:00:00')。 | B树索引适合范围查询,但索引列顺序影响效率(如索引为timestamp, device_id,查询条件需包含这两个列);哈希索引无法范围扫描,数据更新时需重建。 |
| 范围分区 vs 列表分区 | 范围分区:按值范围(如时间)划分;列表分区:按值列表(如设备ID列表)划分。 | 范围分区:按时间维度查询(如最近7天数据);列表分区:查特定设备组数据(如设备ID为101-105的设备)。 | 范围分区易导致数据倾斜(如某天数据量过大),需合理选择分区粒度(如按月分区,避免按天分区导致分区数量过多);列表分区分区数量有限,适合设备数量固定场景。 |
4) 【示例】
CREATE TABLE process_data (
batch_id BIGINT NOT NULL,
timestamp TIMESTAMP NOT NULL,
device_id INT NOT NULL,
process_param JSONB, -- 工艺参数(如温度、压力)
quality_flag BOOLEAN,
PRIMARY KEY (batch_id, timestamp, device_id)
) PARTITION BY RANGE (timestamp) (
PARTITION p1 VALUES LESS THAN ('2024-01-01'),
PARTITION p2 VALUES LESS THAN ('2024-02-01'),
PARTITION p3 VALUES LESS THAN ('2024-03-01')
);
CREATE INDEX idx_time_device ON process_data (timestamp, device_id);
SELECT * FROM process_data
WHERE device_id = 101
AND timestamp BETWEEN '2024-01-01' AND '2024-01-31'
ORDER BY timestamp;
5) 【面试口播版答案】
“面试官您好,针对超10TB制程数据的存储与查询优化,核心思路是分库分表结合列式存储,配合索引、分区和缓存。首先,表结构设计上,主键用批次ID+时间戳+设备ID,字段包括设备ID、时间戳、工艺参数(JSONB存储复杂数据),保证数据唯一性。然后,索引策略:为常用查询(如按时间范围查设备数据)创建复合B树索引(如timestamp, device_id),覆盖查询条件,减少扫描行数;对等值查询(如查特定时间点数据)可补充哈希索引。接着,采用范围分区(按时间分区),比如按天分区,这样查询时只需扫描对应日期分区,避免全表扫描。缓存方面,对高频查询结果(如实时统计报表)用Redis缓存,比如将“设备101最近7天合格率”结果存入缓存,减少数据库压力。最后,考虑列式存储数据库(如ClickHouse),它适合时序数据,压缩比高,查询性能好。总结来说,通过分区减少扫描范围、索引覆盖查询条件、缓存热点数据,能有效平衡存储与查询性能。”
6) 【追问清单】
7) 【常见坑/雷区】
timestamp, device_id,查询条件为device_id=101 AND quality_flag=1,但未索引quality_flag),仍需回表,降低性能。