sequelize事务
![](~/21-06-17.jpg)
# 数据库ORM处理N+1查询问题
# 简述
1+n是执行一次查询获取n条主数据后,由于关联引起的执行n次查询从数据;它带来了性能问题;
# 避免/优化方案
数据表:user表:user_id,name,course_id; course表:course_id, name
需求是得到以下结构:
[
{
"id": 1, "name": "simple", "course_id": 1, "course":{"course_id": 1, "name": 'english'}
}
],
1
2
3
4
5
2
3
4
5
# 循环查询
首先查询用户列表,然后循环用户列表查询对应的课程信息;
此方法是一次查询列表,N次查询课程,性能最低。
$users = "select * from user";
foreach($users as $user) {
$users['course'] = "select * from course where id = " .$user['course_id'];
}
1
2
3
4
2
3
4
# 连表查询
这种方法有局限性,如果该两张表不在同一个服务器是不可以连表的。
$users = "select * from user as u join course as c on c.course_id = u.course_id";
1
# 1+1查询
流程:先查询1次用户列表、取出列表中的课程ID组成数组、查询课程、合并数据;
此方法在目前微服务流行的情况下是比较好的一种做法。
$users = "select * from user";
$course_ids = [];
foreach($users as $user) {
if(!in_array($user['course_id'], $course_ids)){
$course_ids[] = $user['course_id'];
}
}
$courses = "select * from course where id in ('.join(',', $course_id).')";
$map = [];
foreach($courses as $course) {
$map[$course['course_id']] = $course;
}
foreach($users as $user) {
$map['course'] = $map[$user['course_id']] ?? null;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
上次更新: 2022/04/15, 05:41:31