Пишу простенький локальный веб-сервер для работы с данными из соцсети VK. Это мой личный учебный проект, чисто для локального использования. Ни с Go ни с Sqlite ранее не работад.
С помощью API выкачиваю данные, затем закладываю их в базу на sqlite.
Я ожидал что все это будет работать очень быстро, а оно реально тормозит.
Скачивание по 1000 записей происходит быстро, а вот добавление в базу (операция "upsert", т.е. добавление или обновление если данные уже есть) — крайне медленно, в среднем по полсекунды на запись. Т.е. просто глазами видно как в консоль раз в полсекунды-секунду выводятся строчки с именами юзеров.
Сделано конечно в лоб. Вот например цикл по массиву скачанной порции данных
for _, member := range members.Items {
name := member.FirstName + " " + member.LastName
fmt.Println(name)
app.UpsertUser(member.ID, name)
}
Вот функция добавления и обновления юзера
func (app *Application) UpsertUser(uid int, name string) {
user := User{Uid: uid}
app.db.FirstOrCreate(&user, User{Uid: uid})
if !(name == "DELETED" && user.Name != "DELETED") {
user.Name = name
}
app.db.Save(&user)
}
Для работы с sqlite используется библиотека GORM.
Откуда такие огромные задержки и как можно ускорить работу с базой?