🗒️N+1问题
type
status
slug
summary
tags
category
icon
password
Date
在数据库查询中,N+1 问题是一个常见的性能问题,特别是在使用ORM时。这个问题通常出现在需要从一个表中获取多个记录,并且每个记录都有与之关联的其他表记录时(外键关联)。
N和1的含义: 如果你从主表("主查询")中获取了 N 条记录,然后对每条记录都访问了其关联对象,你实际上会执行 N+1 次数据库查询:一次是主查询,其余 N 次是为每个主记录获取关联对象的查询。
一句话说明:其实就是在ORM中,该用JOIN语句时,没有用
示例
假设我们有两个表:一个是
学生表,另一个是课程表。每个学生可以选修多门课程,因此这是一对多的关系。
- 学生表
学生ID | 姓名 |
1 | Alice |
2 | Bob |
3 | Carol |
- 课程表
课程ID | 课程名 | 学生ID |
1 | 数学 | 1 |
2 | 英语 | 1 |
3 | 物理 | 2 |
4 | 化学 | 3 |
如果你想获取每个学生及其选修的所有课程,一种直观的方法是:
- 首先查询学生表,获取所有学生(1次查询)。
- 然后,对于每个学生,查询他们选修的课程(N次查询,N是学生数量)。
这样,总共需要N+1次查询。
对应到sql语句是
熟悉sql的一看,这不是应该使用LEFT JOIN吗?
其实在SQLAlchemy中,也有类似的语句,可以使用
joinedload来进行预加载,从而一次性获取所有需要的信息Loading...