使用情况: 数据需要基于本地进行更新到数据库, 比如前端提交多个用户的数据
正常思维, 获取数据直接更新
有个问题, 如果数据量很大, 速度会很慢,本地测试20000条数据要20s级别
type User struct {
gorm.Model
Name string `gorm:"uniqueIndex"`
Nickname string
Email string
}
func BatchUpdate(db *gorm.DB) {
// 获取到前端数据
var localUsers []User
// 遍历并更具条件更新
for _, user := range localUsers {
db.Model(user).Where("name = ?", user.Name).Update("email", user.Email).Update("nickname", user.Nickname)
}
}
正确做法
先拿到数据库数据, 然后本地与数据库数据缓存对比, 然后写入数据库缓存, 20000数据在200ms级别
使用自带的save 比update快很多, 不知道为啥, 有兴趣的自己Debug看sql
func BatchUpdate(db *gorm.DB) {
// 拿到数据库数据
var dbUsers []User
db.Model(User{}).Find(&dbUsers)
// 使用map储存 空间换时间
var dbUserMap map[string]User
for _, user := range dbUsers {
dbUserMap[user.Name] = user
}
// 拿到本地要修改的数据
var localUsers []User
for _, localUser := range localUsers {
if dbUser, exist := dbUserMap[localUser.Name]; exist {
dbUser.Nickname = localUser.Nickname
dbUser.Email = localUser.Email
// 使用自带的save进行保存, 速度嘎嘎快
db.Save(dbUser)
}
}
}