
1) 【一句话结论】采用混合数据库架构,关系型数据库(如MySQL)存储原始日志并按天分区,建立复合索引;时序数据库(如InfluxDB)存储聚合指标,支持时间序列分析,平衡存储与查询性能。
2) 【原理/概念讲解】
针对学习行为日志,核心是设计结构化表并优化查询路径。日志表需包含行为类型(如视频点击、作业提交)、时间戳(事件发生时间)、用户ID/课程ID(关联主体)、正确率(答题指标)等字段。
user_id + event_time、course_id + event_time、behavior_type + event_time),覆盖常用查询场景(如查询用户历史行为、课程参与情况),通过索引快速定位数据。PARTITION BY RANGE (TO_DAYS(event_time))),将每日数据分散存储,减少单表数据量,提升查询效率。(类比:日志表像“行为记录本”,按天分区像把每天的记录装进不同文件夹,索引像给记录本标页码,方便快速找到某天的某条记录;时序数据库像“趋势图”,专门记录数据随时间的变化,适合看趋势。)
3) 【对比与适用场景】
| 数据库类型 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 关系型(如MySQL) | 结构化数据,支持ACID事务 | 强一致性,支持复杂查询,事务处理 | 用户信息、课程信息等结构化数据 | 不适合高吞吐时间序列,查询复杂时性能下降 |
| 时序数据库(如InfluxDB) | 专为时间序列设计,列式存储 | 高吞吐,时间聚合,自动压缩 | 日志、指标、传感器数据(如正确率趋势) | 不支持复杂关联查询,适合聚合分析 |
4) 【示例】
CREATE TABLE student_behavior (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
user_id BIGINT NOT NULL,
course_id BIGINT NOT NULL,
behavior_type ENUM('video_click', 'assignment_submit', 'discussion_participate') NOT NULL,
event_time TIMESTAMP NOT NULL,
correct_rate DECIMAL(5,2),
INDEX idx_user_time (user_id, event_time),
INDEX idx_course_time (course_id, event_time),
INDEX idx_type_time (behavior_type, event_time)
);
PARTITION BY RANGE (TO_DAYS(event_time)) (
PARTITION p202401 VALUES LESS THAN (TO_DAYS('2024-02-01')),
PARTITION p202402 VALUES LESS THAN (TO_DAYS('2024-03-01')),
PARTITION p202403 VALUES LESS THAN (TO_DAYS('2024-04-01')),
PARTITION MAXVALUE
);
INSERT student_behavior, user_id=1001, course_id=101, behavior_type="video_click", event_time=1701234567, correct_rate=0.85
5) 【面试口播版答案】
面试官您好,针对每天50万条学习行为日志,我会设计混合数据库方案。首先,在关系型数据库(如MySQL)中创建日志表,包含行为类型、时间戳、用户/课程ID等字段,并按天分区存储,减少单表数据量。然后建立复合索引(如按用户和时间排序的索引),覆盖常用查询路径(如用户行为历史、课程参与情况),提升查询性能。对于高频时间序列分析(如每日正确率趋势),引入时序数据库(如InfluxDB),存储聚合后的指标,支持快速查询趋势。具体来说,MySQL表通过分区和索引优化了原始日志的存储与查询,时序数据库则针对时间序列分析进行了专门优化,平衡了存储成本与查询效率。
6) 【追问清单】
7) 【常见坑/雷区】