GORM golang在几个查询后变得超级慢

jchrr9hc  于 2023-04-27  发布在  Go
关注(0)|答案(1)|浏览(435)

我有一个简单的查询,它选择产品并按名称在哪里搜索它们。数据库(postgres)有大约200万个产品,标题被索引以更快地执行搜索。
现在,当我连续执行5个查询时,前几个(大部分是4个)执行得非常快,之后的查询执行得非常慢-有时超过5秒。
但是,当我使用GORM在GORM中执行完全相同的查询时,或者当我直接连接到数据库时,它会在20 ms内再次执行。
为什么GORM在几次查询之后变得非常慢?

res := dbHandler.
    Scopes(query.Paginate(listRequest)).
    Where(where.Main, where.Values...).
    Order(orderBy).
    Find(rows)

由GORM生成的查询:

SELECT    
    "products"."id", "products"."active", "products"."title",
    "products"."subtitle", "products"."description", "products"."isbn",
    "products"."ean", "products"."bznr",
    "products"."cover_picture", "products"."publication_date",
    "products"."edition", "products"."publisher", "products"."stock",
    "products"."delivery_time", "products"."selling_price",
    "products"."width", "products"."height",
    "products"."length", "products"."weight" 
FROM 
    "products" 
WHERE 
    products.title ILIKE '%Warum Frauen alles besser wissen - und trotzdem alles falsch machen%' 
LIMIT 10

它没有其他流量,只有一个接一个发生的5个查询,所以我不希望前四个20 ms的查询执行到5s+。

mitkmikd

mitkmikd1#

我不知道它是否有效,但试试这个,
创建gorm数据库对象时,请尝试只创建一次,示例如下

import (
  "gorm.io/driver/postgres"
  "gorm.io/gorm"
  "sync"
)

var (
    once = sync.Once{}
    db *gorm.DB
)

func GetCon() *gorm.DB {
  once.Do(func() {
    dsn := "host=localhost user=gorm password=gorm dbname=gorm port=9920 sslmode=disable TimeZone=Asia/Shanghai"
    db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{})
    if err != nil {
        panic(err.Error())
    }
  })
  return db
}

然后使用GetCon()函数每次获取数据库对象,这将只创建一次数据库对象,并且不会每次尝试重新连接到数据库,它可能会使您的应用程序性能更好。
虽然这个解决方案可能有效,但使用gorm是一个非常糟糕的主意这里是一个链接到reddit讨论GORM is a bad idea?。当涉及到较大的项目时,我建议使用entgo.io。它对于较大的项目是可靠的,并且通过它的代码生成和预定义的功能,如钩子,拦截器,mixins等。你可能会发现一开始很难使用,但它值得努力。根据你的能力,大约需要一周到一个月的时间来学习这个实体框架。它也会让你的开发更快,因为它会根据你的数据库字段和关系生成必要的方法。您的查询将是方式容易后,初步设置.你将能够做复杂和棘手的查询非常容易.
此外,它是由可靠的一组人,如Alex Snast从facebook和Ariel Mashraki开发的。
即使你使用entgo,我也建议你使用上面的方法。
还有另一个软件包SQLBolier,它也非常好,更容易开始,但我仍然建议使用entgo

相关问题