Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL更新连接性能_Php_Mysql_Performance_Join - Fatal编程技术网

Php MySQL更新连接性能

Php MySQL更新连接性能,php,mysql,performance,join,Php,Mysql,Performance,Join,我需要根据另一个表中的列更新一个表中的多个列。首先,我只是更新其中一个。我已经尝试了两种方法,这两种方法都有效,但使用mySQL命令大约需要4分钟,在php中运行时需要20多分钟。两个表都大约有20000行长 我的问题是,有没有更好或更有效的方法 方法1: UPDATE table_a,table_b SET table_a.price = table_b.price WHERE table_a.product_code=table_b.product_code U

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

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

方法1:

   UPDATE table_a,table_b 
   SET table_a.price = table_b.price 
   WHERE table_a.product_code=table_b.product_code
   UPDATE table_a INNER JOIN table_b 
   ON table_a.product_code = table_b.product_code
   SET table_a.price=table_b.price
方法2:

   UPDATE table_a,table_b 
   SET table_a.price = table_b.price 
   WHERE table_a.product_code=table_b.product_code
   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)

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

您的查询如下所示:

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)
这将告诉您是否正在使用索引,请参阅和

在您的情况下,您没有任何索引(
可能的keys=null
)迫使MySQL执行完整的表扫描


当速度慢是一个问题时,您应该始终对查询执行
解释选择
。您必须将非select查询转换为
select
,但这并不困难,只要在select子句中列出所有已更改的字段,然后复制
join
where
子句。

您的ID列是否已编制索引?它们都是相同的。对第一个查询运行EXPLAIN EXTENDED,然后显示警告;它们并不完全相同,因为其中一个是设置id,另一个是设置价格。隐式连接语法和显式连接语法在性能上没有区别。抱歉,时间太晚了,它们都设定了价格,上面已经编辑过。因此,它们都匹配ID,然后根据表a中的表b设置价格。@fB因为索引提示正是我所需要的(SQL课程还没有走那么远!)-在上创建,更新时间从4分钟缩短到不到1秒。谢谢