
1) 【一句话结论】
采用时序数据库(TimescaleDB)与对象存储(OSS)结合,按时间(天)+区域ID分库分表,时间B+树+R树+复合索引,结合H.265压缩(关键帧间隔1秒,码率2Mbps),实现海量视频流的存储与快速检索。
2) 【原理/概念讲解】
智慧安防的视频流属于时序数据,数据量巨大(每秒30帧1080p,H.265压缩后约1.5MB/秒,每天约129GB)。单库容量有限(如MySQL单库最大2TB,实际存储效率低),需分库分表。
day_YYYYMMDD),水平分表(按区域维度,每个区域一个表,表名为area_XX),分片键为(date, area_id),负载均衡用一致性哈希(如Redis hash slot)。3) 【对比与适用场景】
| 方案/组件 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 时序数据库(TimescaleDB) | PostgreSQL分支,支持时间序列数据,时间分区、自动索引 | 支持时间范围查询、高效时间索引、水平扩展 | 海量视频流按时间检索(如按天、周) | 不适合复杂关联,需与关系型数据库结合 |
| 关系型数据库(MySQL) | 传统RDBMS | 支持事务、外键、复杂查询 | 存储元数据(摄像头配置、区域信息) | 单表数据量有限,需分库分表 |
| 按时间分库 | 按时间维度拆分数据库实例 | 每天一个库,按天扩展 | 时间跨度大的数据(如一年监控数据) | 跨天查询需跨库连接,性能下降 |
| 按时间+区域分库 | 结合时间与区域维度分库 | 每天每个区域一个库,按天+区域扩展 | 区域多且时间跨度大的场景 | 跨天查询需跨库连接,但区域查询性能高 |
| 时间B+树索引 | B+树索引,按时间排序 | 高效时间范围查询 | 按时间检索视频(如最近1小时) | 写入大量数据时索引维护成本低 |
| R树空间索引 | 空间索引,用于地理/区域检索 | 支持空间范围查询(如按区域) | 区域检索(如某个小区的视频) | 需计算空间数据(如经纬度转区域ID) |
| H.265压缩(关键帧1秒,码率2Mbps) | 视频压缩算法,参数设置 | 压缩比约1:10,存储空间减少,检索速度提升 | 大规模视频存储与检索 | 参数需根据实际场景调整(如关键帧间隔过短增加存储,过长影响实时性) |
4) 【示例】
视频流表结构(伪代码):
-- 存储元数据(数据库)
CREATE TABLE video_metadata (
video_id BIGINT PRIMARY KEY,
timestamp BIGINT NOT NULL,
camera_id INT NOT NULL,
area_id INT NOT NULL,
event_type VARCHAR(20),
video_path VARCHAR(255) -- OSS路径
);
-- 索引
CREATE INDEX idx_timestamp ON video_metadata (timestamp);
CREATE INDEX idx_area_event ON video_metadata (area_id, event_type);
分库分表示例:
day_20240101(存储2024年1月1日的视频数据)。area_1(属于day_20240101库,存储区域1的视频数据)。数据压缩与存储示例:
oss://security-bucket/video/20240101/area1/event.mp4。video_metadata表中video_path字段存储OSS路径。查询示例(按时间+区域+事件检索):
SELECT video_id, video_path
FROM video_metadata
WHERE timestamp BETWEEN 1672531200000 AND 1672628800000
AND area_id = 1
AND event_type = '异常移动';
5) 【面试口播版答案】
“面试官您好,针对海量视频流的存储与快速检索需求,我的核心设计是采用时序数据库(TimescaleDB)与对象存储(OSS)结合,并配合按时间+区域分库分表、多维度索引(时间B+树+R树+复合索引),具体如下:
首先,存储结构上,视频数据压缩为H.265(关键帧1秒,码率2Mbps),存储到OSS,数据库仅存储元数据(时间戳、摄像头ID、区域ID、事件类型)。时间戳建立B+树索引,实现按时间快速检索(如按小时、天查询);区域和事件类型建立复合索引,支持按区域+事件类型检索。
然后,分库分表策略:按时间维度分库(每天一个库,库名为day_YYYYMMDD),按区域维度分表(每个区域一个表,表名为area_XX),分片键为(date, area_id),负载均衡用一致性哈希(如Redis的hash slot),避免热点数据集中。
数据压缩方面,H.265压缩比约1:10,大幅减少存储空间(如每天压缩后约13GB),降低OSS成本;检索时通过OSS路径快速访问,数据库仅处理元数据,减少I/O压力。
索引优化:时间B+树用于时间检索,R树用于空间检索,复合索引用于多条件组合,辅以Redis缓存热点数据(如最近1小时的查询结果),减少数据库压力。
总结来说,通过时序数据库的时序特性、分库分表的水平扩展、多维度索引与缓存,实现海量视频流的存储与快速检索,满足按时间、区域、事件类型的查询需求。”
6) 【追问清单】
7) 【常见坑/雷区】