51mee - AI智能招聘平台Logo
模拟面试题目大全招聘中心会员专区

在智慧安防系统中,需要存储海量视频流(如城市监控摄像头,每秒30帧,分辨率1080p),并支持快速检索(如按时间、区域、事件类型)。请设计数据库的存储结构、索引策略以及分库分表方案,并说明如何优化查询性能。

佳都科技集团股份有限公司产品/算法/C++/java/测试/电子/电气等工程师难度:中等

答案

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)。
  • 索引策略:时间B+树(按时间范围快速定位,如按小时、天查询)、R树(空间索引,按区域检索)、复合索引(时间+区域+事件类型,支持多条件组合)。
  • 数据压缩:使用FFmpeg进行H.265压缩,关键帧间隔1秒,码率2Mbps,压缩比约1:10,减少存储空间(如每天压缩后约13GB),降低OSS成本。
    类比:视频流像流水线,时间分区表按天分区,就像按批次存储,索引按流水线序号快速找到批次,空间索引按区域找批次位置。

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的视频数据)。

数据压缩与存储示例:

  • 压缩:使用FFmpeg将视频流压缩为H.265格式,关键帧间隔1秒,码率2Mbps。
  • 存储:将压缩后的视频文件上传至阿里云OSS,路径为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) 【追问清单】

  • 问:分库分表后跨天查询如何优化?比如连接多个库是否影响性能?
    回答要点:采用TimescaleDB的时间分区表(time partition),按天分区存储,查询时通过分区表扫描,减少跨库连接开销,优化跨天查询性能。
  • 问:H.265压缩的具体参数(如关键帧间隔、码率)如何影响存储和检索?
    回答要点:关键帧间隔1秒,码率2Mbps,压缩比约1:10,减少存储空间(如每天约13GB),检索时通过OSS路径快速访问,数据库仅处理元数据,提升检索速度。
  • 问:索引维护成本,比如时间B+树在写入大量数据时是否会影响写入性能?
    回答要点:时序数据库支持时间分区,新数据写入当前分区,索引维护成本较低;可通过批量插入或延迟索引更新(如MySQL的延迟索引)优化,避免写入瓶颈。
  • 问:分库分表策略中,区域变化时如何调整?
    回答要点:水平分表按区域ID哈希分表,区域新增时重新分配分片,或调整分片键(如区域ID范围),确保负载均衡。

7) 【常见坑/雷区】

  • 坑1:跨天查询未优化,仅按时间分库导致跨库连接开销大。
    雷区:若仅按时间分库,区域检索需全表扫描,性能低;应按时间+区域分库分表,或使用时间分区表减少连接。
  • 坑2:数据压缩参数不明确,直接用默认设置。
    雷区:关键帧间隔过短(如0.5秒)增加存储,过长(如5秒)影响实时性;需根据实际场景测试,选择最优参数。
  • 坑3:索引选择错误,用普通B+树代替时间B+树。
    雷区:时间戳作为主键或唯一索引,利用数据库的时序索引优化,避免全表扫描;否则时间检索性能差。
  • 坑4:分库分表策略不合理,如仅按时间分库但未考虑区域热点。
    雷区:若区域1是热点,所有数据都存入该库,导致单库压力过大;应按时间+区域分库分表,均衡负载。
51mee.com致力于为招聘者提供最新、最全的招聘信息。AI智能解析岗位要求,聚合全网优质机会。
产品招聘中心面经会员专区简历解析Resume API
联系我们南京浅度求索科技有限公司admin@51mee.com
联系客服
51mee客服微信二维码 - 扫码添加客服获取帮助
© 2025 南京浅度求索科技有限公司. All rights reserved.
公安备案图标苏公网安备32010602012192号苏ICP备2025178433号-1