[英]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.分小部分進行更新
找出導致緩慢的原因。
僅運行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.