Mysql Groovy withBatch非常慢
我正在尝试使用Groovy的批处理函数,它非常慢(15秒)。我尝试过不同的批量大小(10400…),每次都要花很多时间 这是我用它编写的第二个查询,它们都很慢 这是我的密码。是有缺陷还是我用错了Mysql Groovy withBatch非常慢,mysql,groovy,Mysql,Groovy,我正在尝试使用Groovy的批处理函数,它非常慢(15秒)。我尝试过不同的批量大小(10400…),每次都要花很多时间 这是我用它编写的第二个查询,它们都很慢 这是我的密码。是有缺陷还是我用错了 static updateCSProducts(def conn, def webProductRows){ conn.withBatch(400, """ UPDATE cscart_products p SET usergroup_ids=:usergroup_ids,
static updateCSProducts(def conn, def webProductRows){
conn.withBatch(400, """
UPDATE cscart_products p
SET usergroup_ids=:usergroup_ids,
b2b_group_ids=:b2b_group_ids,
b2b_desc_hide=:b2b_desc_hide
WHERE product_code = :product_code
OR product_id = (SELECT product_id FROM cscart_product_options_inventory WHERE product_code = :product_code)
""") { ps ->
webProductRows.each({row ->
ProductType type = ProductType.fromCode(row.type)
String userGroupIds = type.getProductAvailabilityUserGroup().collect{it.getId()}.join(",")
String b2bGroupIds = type.getB2bUserGroup().collect{it.getId()}.join(",")
boolean b2bDescHide = !type.getB2bUserGroup().isEmpty()
println row.id + " " + userGroupIds + " " + b2bGroupIds + " " + b2bDescHide
ps.addBatch(product_code:row.id, usergroup_ids:userGroupIds, b2b_group_ids:b2bGroupIds, b2b_desc_hide:b2bDescHide)
})
}
}
我使用MySql作为数据库。当我查看SQL连接时,在等待下一批处理时,实际上没有看到任何连接运行查询
编辑:
我已经删除了查询,但仍然非常慢。 更新版本如下:
conn.withBatch(400, """
UPDATE cscart_products p
SET usergroup_ids=:usergroup_ids,
b2b_group_ids=:b2b_group_ids,
b2b_desc_hide=:b2b_desc_hide
WHERE p.product_code = :product_code
""") { ps ->
webProductRows.each({row ->
ProductType type = ProductType.fromCode(row.type)
String userGroupIds = type.getProductAvailabilityUserGroup().collect{it.getId()}.join(",")
String b2bGroupIds = type.getB2bUserGroup().collect{it.getId()}.join(",")
String b2bDescHide = !type.getB2bUserGroup().isEmpty() ? 'Y' : 'N'
println row.id + " " + userGroupIds + " " + b2bGroupIds + " " + b2bDescHide
ps.addBatch(product_code:row.id, usergroup_ids:userGroupIds, b2b_group_ids:b2bGroupIds, b2b_desc_hide:b2bDescHide)
})
}
每次更新都会运行大量查询。您最好检索一个数据列表,然后在上面循环。这不是批处理的瓶颈,而是您的实现 product_代码列上有索引。我已经删除了查询,但仍然非常慢。请参阅更新。否,在每个迭代中仍有查询
ProductType.fromCode()
,type.getProductAvailabilityUserGroup()
,等等。这些都是在后台运行的查询。我建议打开SQL日志来查看您正在运行的查询数量,您可能会感到惊讶。不,这些是枚举和枚举中某个字段的访问器。它不会进入数据库。如果我对这行进行注释,它运行得非常快:ps.addBatch(产品代码:row.id,用户组id:usergroupID,b2b组id:B2BGroupID,b2b描述隐藏:b2bDescHide)