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