一架梯子,一头程序猿,仰望星空!
GORM面试题 > 内容正文

你了解GORM的N + 1查询问题吗?如何解决它?


问题简答

在GORM中,N+1查询问题指的是当查询一个对象的列表数据的时候,GORM会首先查询列表中的对象的ID,然后循环生成单独的SQL去查询对象的详细数据。这会导致SQL查询过多问题,例如查询10条订单数据,因为订单模型关联了用户模型,GORM会产生10条SQL去查询用户数据,再加上查询订单数据那一条SQL,就是10 + 1 = 11条SQL,这就是N+1问题,解决N+1问题主要是通过Preload(预加载)实现。

问题详解:

1.通过Preload解决N+1问题

1.1.定义模型

// 定义订单模型,订单包含一个用户模型
type Order struct {
    ID       uint
    UserID   uint
    User     User // 关联的用户信息
    Amount   float64
    Currency string
    CreatedAt time.Time
}

// 定义用户模型
type User struct {
    ID    uint
    Name  string
    Email string
}

1.2.Preload查询

// 保存订单列表
var orders []Order

// 预加载User模型,这里不会通过订单查询出所有的用户ID,然后循环一个个的去查询用户信息,而是通过合并SQL一起查询
err := db.Preload("User").Find(&orders).Error