MySQL更新连接性能

时间:2015-05-17 22:10:55

标签: php mysql performance join

我需要根据另一个表中的列更新一个表中的多个列。首先,我只是更新其中一个。我尝试了两种方法,这两种方法都有效,但它们使用mySQL命令大约需要4分钟,而在php中运行则需要20多分钟。两个表都长约20,000行。

我的问题是,有更好或更有效的方法吗?

方法1:

   UPDATE table_a,table_b 
   SET table_a.price = table_b.price 
   WHERE table_a.product_code=table_b.product_code

方法2:

   UPDATE table_a INNER JOIN table_b 
   ON table_a.product_code = table_b.product_code
   SET table_a.price=table_b.price

我猜这些基本上都是以同样的方式工作,但我认为连接会更有效率。 product_code列是随机文本,虽然是唯一的,每行与另一个表中的一行匹配。

我还能尝试其他什么吗?

由于

更新:这是通过创建索引来解决的,例如

    CREATE UNIQUE INDEX index_code on table_a (product_code)
    CREATE UNIQUE INDEX index_code on table_b (product_code)

1 个答案:

答案 0 :(得分:1)

如果查询运行缓慢,则必须检查查询正在使用的数据。

您的查询如下所示:

UPDATE table_a INNER JOIN table_b 
ON table_a.product_code = table_b.product_code
SET table_a.price=table_b.price

为了查看延迟的位置,你可以做到

EXPLAIN SELECT a.price, b.price FROM table_b b
INNER JOIN table_a a ON (a.product_code = b.product_code)

这将告诉您是否正在使用索引,请参阅the info on EXPLAINmore info here

在您的情况下,您没有任何索引(possible keys = null)强制MySQL进行全表扫描。

当问题缓慢时,您应始终对查询执行explain select。您必须将非选择查询转换为select,但这并不困难,只需列出select子句中所有已更改的字段,然后复制joinwhere子句。