2012-08-10 72 views
0

所以我一直在努力运行这个查询。这需要很长时间。
其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;

我有一种感觉,我有点拧在这里,但认为Id试试无论如何。

+1

您可以添加表定义和任何索引 – gbn 2012-08-10 14:34:24

+0

和EXPLAIN 可以通过真正有用的。 – mvf 2012-08-10 14:37:17

+0

@mvf:MySQL中UPDATE语句没有'EXPLAIN' :( – 2012-08-10 14:38:16

回答

0

我认为这种类型的请求的执行速度慢的可能的原因可能是:

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

只需使用联合过滤器进行选择需要很长时间才能完成。 – Tyler 2012-08-10 15:01:34

+0

然后看看EXPLAIN的那个SELECT;) – mvf 2012-08-10 15:03:03

+0

@Tyler。 。 。我建议先在SELECT上工作。您始终可以将结果放入临时表中进行更新。 – 2012-08-10 15:07:46

0

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

UPDATE,这不是一个有效的选项(原样)。当然

不够,我在UPDATE docs忽略了这个:

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

+0

不能对该查询使用LIMIT“UPDATE和LIMIT的使用不正确” – Tyler 2012-08-10 14:46:30

+0

确定'nough。Edit显示未来发现者的问题,保留未删除的答案供将来参考 – 2012-08-10 15:48:48