簡體   English   中英

更新語句中的MySQL查詢緩慢

[英]Slow MySQL query on update statement

我正在嘗試將一些數據從數據庫移動到另一個數據庫。 我目前在數據庫中有超過一百萬個條目,我期望這花費很長時間,但已經過去了50分鍾,但沒有結果:)。 這是我的查詢:

UPDATE xxx.product AS p 
LEFT JOIN xx.tof_art_lookup AS l ON p.model_view = l.ARL_SEARCH_NUMBER 
SET p.model = l.ARL_DISPLAY_NR 
WHERE p.model_view = l.ARL_SEARCH_NUMBER;

歡迎提供任何有關如何改進此查詢的幫助。 提前致謝!

如果您不希望擺脫JOIN,則p.model_view,l.ARL_SEARCH_NUMBER上的索引。
實際上,可以根據實際數據量及其值(存在NULL)對它進行優化,方法是:
1.監視查詢執行計划,如果不好的話,為編譯器放置查詢提示,或為子查詢交換JOIN,以便編譯器在其中使用另一種連接類型(合並/嵌套循環/哈希/其他)
2.使存儲過程具有更復雜但更快速的邏輯
3.分小部分進行更新

找出導致緩慢的原因。

檢查JOIN是否優化

僅運行SELECT:

SELECT COUNT(*)
FROM xxx.product p LEFT JOIN xx.tof_art_lookup l 
  ON p.model_view = l.ARL_SEARCH_NUMBER;

需要多長時間? EXPLAIN SELECT ...檢查INDEX是否用於JOIN。

如果對於JOIN來說一切都很好,那么UPDATEING行將很慢。 這種情況很難使事情變得更快。

更新=刪除並插入

我沒有嘗試過。 但有時這種策略更快UPDATE是使用新值刪除舊行,並插入新行。

// CREATE new table and INSERT
CREATE TABLE xxx.new_product
SELECT p.model_model, l. ARL_DISPLAY_NR, ... 
FROM xxx.product p LEFT JOIN xx.tof_art_lookup l 
  ON p.model_view = l.ARL_SEARCH_NUMBER;

// drop xxx.procuct
// rename xxx.new_product to xxx.product

將表分成小塊,並發運行

我認為您的工作是受CPU限制的,而UPDATE查詢僅使用一個CPU就不能使許多內核受益。 xxx.product表沒有加入約束,那里有1M行被順序更新

我的建議如下。

給xxx.product提供一些條件,以便xxx.product分成20組。 (我不知道哪一列會更適合您,因為我沒有有關xxx.product的信息)

然后一次並發運行20個查詢。

例如:

// for 1st chunk
UPDATE xxx.product AS p 
...
WHERE p.model_view = l.ARL_SEARCH_NUMBER
  AND p.column BETWEEN val1 AND val2; <= this condition spliting xxx.product

// for 2nd chunk
UPDATE xxx.product AS p 
...
WHERE p.model_view = l.ARL_SEARCH_NUMBER
  AND p.column BETWEEN val2 AND val3;

...
...

// for 20th chunk
UPDATE xxx.product AS p 
...
WHERE p.model_view = l.ARL_SEARCH_NUMBER
  AND p.column BETWEEN val19 AND val20;

均勻找到BETWEEN值分配表很重要。 直方圖可能會幫助您。 獲取直方圖的數據

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM