2011-10-02 99 views
0

我試圖運行這個查詢,並且正在更新的表有大約10,000行。查詢需要很長時間才能執行,我甚至無法等待返回。優化MySQL UPDATE查詢

在幾個小時內,這個表格將有100,000行,所以它將比現在長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數據庫上進行了優化。

+0

我這是很多反引號。 – Bojangles

+0

您可以像優化select語句一樣優化更新語句。使用相同的表連接和where子句在相同的查詢上運行解釋以查看發生了什麼。 –

+0

@JamWaffles:是的,愛我的背部蜱:),人們告訴我不要使用它們,但我忽略它們。我記得當我第一次開始使用mysql時,由於我使用了保留字,所以我一直存在錯誤,所以現在我反覆使用。 +它有助於如果我想查找/替換 – Drahcir

回答

0

要索引的列是where子句中的那些引用。

考慮添加以下:

  1. 上pm.ManufacturerNumberShort列的索引。
  2. pm.ManufacturerNumberLong列的索引。
  3. pm.id列上的索引。
  4. pm.ManufacturerID列的索引。
  5. ppi.DistributorPartNumberShort列上的索引。
  6. ppi.DistributorID列上的索引。基於

上輸入從Darhazer:

考慮添加下列的一種或多種:

  1. 上pm.ManufacturerNumberShort,pm.id的索引,並且pm.ManufacturerID列。
  2. pm.ManufacturerNumberLong,pm.id和pm.ManufacturerID列的索引。
  3. ppi.DistributorPartNumberShort和ppi.DistributorID列上的索引。
+0

單個索引不如複合索引快(應該使用index_merge或應該選擇其中一個索引來解決where子句),在更新的情況下,每個索引都會增加寫入所需的時間。 –

0

您正在對供應商編號進行OR,我首先確保您在兩個表上都有供應商編號的索引。

在我看來,其他列已經應該有索引。

+0

@lcarus:是的,謝謝,實際上名爲r2r的數據庫中的表已經完全優化,索引到處都是。目前我正在研究這個product_details表,我可以看到一些非標準的字段類型可能會減慢它的速度。它有varchar(500)等東西,我甚至沒有想到這是可能的,lol – Drahcir