优化MySQL更新查询

优化MySQL更新查询,mysql,Mysql,我正在尝试运行这个查询,正在更新的表大约有10000行。查询的执行时间太长,我甚至都懒得等待返回 再过几个小时,这个表将有100000行,因此,它将需要比它已经需要的时间长10倍。有人有什么想法来优化它吗 UPDATE `wpsapi4`.`product_details` AS `pd`, `r2r`.`partmaster` AS `pm`, `r2r`.`partpriceinv` AS `ppi`, `r2r`.`manufacturer` AS `m` SET `pd`.`pro

我正在尝试运行这个查询,正在更新的表大约有10000行。查询的执行时间太长,我甚至都懒得等待返回

再过几个小时,这个表将有100000行,因此,它将需要比它已经需要的时间长10倍。有人有什么想法来优化它吗

UPDATE

`wpsapi4`.`product_details` AS `pd`,
`r2r`.`partmaster` AS `pm`,
`r2r`.`partpriceinv` AS `ppi`,
`r2r`.`manufacturer` AS `m`

SET

`pd`.`product_name`=`pm`.`ItemName`,
`pd`.`data_source`='R2R',
`pd`.`partmaster`=`pm`.`id`,
`pd`.`pu`=``.`ppi`.`DistributorPartNumberShort`,
`pd`.`description_raw`=`pm`.`ItemDescription`,
`pd`.`dealer_price`=`ppi`.`MSRP`,
`pd`.`weight`=`pm`.`Weight`,
`pd`.`vendor_name`=`m`.`ManufacturerName`

WHERE

(
`pm`.`ManufacturerNumberShort`=`pd`.`vendor_number`
OR
`pm`.`ManufacturerNumberLong`=`pd`.`vendor_number`
)
AND
`pm`.`id`=`ppi`.`DistributorPartNumberShort`
AND
`ppi`.`DistributorID`=2
AND
`pm`.`ManufacturerID`=`m`.`id`

如果你认为这可能与表结构有关,那么请这么说,我现在不能真正改变结构,但是如果你知道索引应该在哪里,那就太好了。r2r数据库上的索引已经过优化。

如果您正在对供应商编号执行
,我将首先确保您在两个表上都有供应商编号索引


在我看来,其他列已经应该有索引了。

要索引的列是where子句中引用的列

考虑添加以下内容:

  • pm.ManufacturerNumber短列上的索引
  • pm.ManufacturerNumberLong列上的索引
  • pm.id列上的索引
  • pm.ManufacturerID列上的索引
  • ppi.DistributorPartNumbers短列上的索引
  • ppi.DistributorID列上的索引
  • 基于Darhazer的输入:

    考虑添加以下一项或多项:

  • pm.ManufacturerNumberShort、pm.id和pm.ManufacturerID列上的索引
  • pm.ManufacturerNumberLong、pm.id和pm.ManufacturerID列上的索引
  • ppi.DistributorPartnerShort和ppi.DistributorID列上的索引

  • 我的天,这是一个很大的回跳。你们可以像优化select语句一样优化update语句。使用同一个表联接和where子句对同一个查询运行explain以查看发生了什么。@JamWaffles:Yeah love my back ticks:),人们告诉我不要使用它们,但我忽略了它们。我记得当我第一次开始使用mysql时,我一直有错误,因为我使用的是保留字,所以现在我到处都打勾如果我想进行查找/替换,它会有所帮助。就我个人而言,我认为它们相当混乱,但这完全是个人喜好的问题。我还没有发现需要使用保留字作为字段名,但我将来可能会这样做@lcarus:是的,谢谢,实际上来自名为r2r的数据库的表已经完全优化了,索引无处不在。我目前正在处理这个product_details表,我可以看到一些非标准字段类型可能会使它变慢。它有像varchar(500)之类的东西,我甚至不认为这是可能的,单个索引不如复合索引快(应该使用index_merge,或者应该选择一个索引来解析where子句),在更新的情况下,每个索引都会增加写入所需的时间。