改进此更新查询

时间:2012-08-10 14:31:45

标签: mysql sql

所以我一直在努力运行这个查询。这需要很长时间 它的MySQL Innodb。我正在使用的字段已编入索引。它在一个非常强大的服务器上,大约10gig分配给innodb池配置。

UPDATE TEMP_account_product p
JOIN products_temp c ON (c.`some_id` = p.`old_someid`)
SET p.`product` = c.id
WHERE p.product IS NULL;

这里要注意的是两个表都包含大约900,000行。这一行带回了大约800,000条记录(WHERE p.product IS NULL;

我有一种感觉,我有点搞砸了,但无论如何都认为我会尝试。

2 个答案:

答案 0 :(得分:0)

我建议分批运行它,这样您就不需要依赖查询计划来决定在开始执行更新之前不将整个结果集放入内存中。在查询中添加LIMIT 1000之类的东西,然后运行它直到受影响的行数为零(技术取决于您的环境,但我认为它可以在SQL中完成)。

UPDATE,这不是有效选项(原样)

果然,我在UPDATE docs

中忽略了这一点
  

对于多表语法...在这种情况下,不能使用ORDER BY和LIMIT。

答案 1 :(得分:0)

我认为这类请求执行缓慢的可能原因可能是:

  • 很可能 - 您在更新的字段上有一个INDEX,并且该请求正在更新很多行 - 在这种情况下,MySQL需要做很多工作来重建INDEX(es)在更新期间。在这种情况下,只需在请求之前删除INDEX,然后重新创建它(如果需要)。
  • JOIN很慢(您可以通过选择JOIN来检查它) - 即连接是在没有INDEXES的情况下完成的。在这种情况下添加索引。
  • 慢速过滤WHERE(即MySQL进行全扫描过滤), - 您可以通过选择相同的过滤器来检查它的速度。