
1) 【一句话结论】针对深圳大学科研管理系统,采用关系型数据库存储结构化科研数据(论文、项目),对象存储(如MinIO)存储非结构化数据(全文、图片),通过复合索引覆盖查询条件、索引下推优化,结合垂直分片(按业务表拆库)与水平分片(按学科ID哈希分表、时间范围范围分表),并采用哈希分片+虚拟分片解决数据倾斜,最终提升大规模数据查询性能。
2) 【原理/概念讲解】科研数据分为结构化(如论文标题、导师ID)和非结构化(全文、图片)。结构化数据需事务一致性,用关系型数据库(如MySQL);非结构化数据存储成本高,用对象存储(如MinIO),数据库仅存储文件路径(路径指向对象存储)。索引优化:复合索引(如mentor_id, subject_id, publish_date)覆盖常用查询,索引下推(MySQL 5.6+)提前过滤数据,减少回表。分库分表:垂直分片按业务表拆分(论文、项目分不同库),水平分片按分片键拆分(论文表按学科ID哈希分表,项目表按时间范围范围分表)。分片键选择:哈希分片(均匀分布,如subject_id % 8)避免倾斜,若倾斜则用虚拟分片(如subject_id + publish_date % 8)。
3) 【对比与适用场景】
| 策略类型 | 定义 | 特性 | 使用场景 | 注意点 |
|---|---|---|---|---|
| 垂直分片 | 按业务表拆分,每个分片含部分表 | 单表数据量减少,跨表JOIN复杂 | 论文、项目等业务表数据量差异大 | 需跨库JOIN,依赖中间件(如MyCat) |
| 水平分片 | 按分片键拆分同一表数据 | 单表数据分散,查询需指定分片 | 论文表(按学科ID)、项目表(按时间) | 分片键选择影响数据分布,需均匀 |
| 分片键策略 | 选择分片键的规则 | 哈希分片(均匀)、范围分片(有序)、组合分片(多字段) | 数据倾斜场景 | 虚拟分片(动态调整)解决倾斜 |
4) 【示例】
论文表(结构化数据):
CREATE TABLE paper (
paper_id INT PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(200),
author VARCHAR(100),
mentor_id INT,
subject_id INT,
publish_date DATE,
file_path VARCHAR(255) -- 指向MinIO的路径(如:minio.sdu.edu.cn/papers/2023/123.pdf)
);
-- 复合索引覆盖查询
CREATE INDEX idx_mentor_subject_date ON paper (mentor_id, subject_id, publish_date);
-- 分库分表示例(按学科ID哈希分片,分8个库)
-- db1.paper1 存储subject_id % 8 = 0的论文
-- db2.paper2 存储subject_id % 8 = 1的论文,依此类推
5) 【面试口播版答案】
面试官您好,针对深圳大学科研管理系统的需求,我设计的数据库模型核心是混合存储结构化与非结构化数据,并优化查询性能。首先,结构化数据(论文、项目)用关系型数据库(如MySQL),因为需要事务一致性;非结构化数据(论文全文、图片)用对象存储(如MinIO),数据库仅存储文件路径,避免存储成本过高。然后,索引优化:为论文表添加复合索引(导师ID、学科ID、发布时间),覆盖“按导师+学科+时间范围检索”的查询,索引下推(MySQL 5.6+)可提前过滤数据,减少回表次数。分库分表方面,考虑到不同学科(如计算机、数学)的论文数据量差异大,采用垂直分片(论文、项目分不同库),同时对于数据量大的论文表,按学科ID哈希分片(如subject_id % 8),分散数据量;项目表按时间范围范围分片(如按年分表),避免近期数据集中。分片键选择上,哈希分片能均匀分布数据,若学科ID分布不均,可结合时间范围作为虚拟分片键(如subject_id + publish_date % 8),解决数据倾斜。总结来说,通过混合存储、复合索引、分库分表及分片键优化,能有效提升大规模科研数据的查询性能,比如分库分表后查询响应时间从秒级缩短,QPS提升(理论依据是数据分散减少单库压力)。
6) 【追问清单】
7) 【常见坑/雷区】