Note与Profile两个模型数据关联查询的最佳实践咨询
方案选型结论
行业内优先推荐选择第三类方案,你列出的前两种方案都存在明显的性能缺陷,不推荐生产环境使用。
各方案缺陷分析
- 方案2(循环单查Profile):属于典型的
N+1查询问题,如果你有1000条Note记录,总共会产生1次Note查询+1000次Profile查询,共1001次数据库IO请求,性能开销极大,任何场景下都不建议使用。 - 方案1(全量查两个表再本地匹配):仅适用于Profile数据量极小的极端场景,一旦Profile量级达到万级以上,全量拉取会浪费大量数据库带宽和本地内存,资源消耗完全冗余。
最优实现方案
分两类技术栈场景选择:
场景1:使用关系型数据库(MySQL、PostgreSQL等)
直接用数据库原生JOIN关联查询,仅需1次IO请求就能拿到所有需要的字段,性能最优,示例SQL如下:
SELECT n.*, p.name, p.profilePicture FROM note n LEFT JOIN profile p ON n.profile_id = p.id
场景2:使用不支持关联的NoSQL数据库
分两步查询,总共仅需2次IO请求:
- 查询所有Note数据,提取所有
profile_id并去重 - 用
IN语句批量查询去重后的profile_id对应的Profile数据 - 本地将两个数据集做关联匹配即可
这种方案的IO开销和内存占用都远低于前两种方案,是NoSQL场景下的首选。
内容的提问来源于stack exchange,提问作者abellay
相关产品推荐
相关产品推荐

