2016-11-20 73 views
0

我正在運行此更新,但MySQL需要很長時間才能完成,大約2分鐘。他們有36個條件去做。Mysql更新倍數條件變慢

我的更新是這樣的:

UPDATE table 
SET delete = NULL 
WHERE date > '2016-11-20 00:00:00' AND (t.text LIKE '%text1%') 
OR (t.text LIKE '%text2%') 
OR (t.text LIKE '%text3%') 
OR (t.text LIKE '%text4%') 
OR (t.text LIKE '% text 5%') 
... 
... 
... 
... 
OR (t.text LIKE '%text36%') 

更新其完成的不錯,但它是這麼長的時間,¿任何想法如何我可以優化呢?

+0

如何在較少的條件下單獨運行它們來檢查? –

回答

1

首先,固定查詢(如豪爾赫建議):

UPDATE table 
    SET delete = NULL 
    WHERE date > '2016-11-20 00:00:00' AND 
     (t.text LIKE '%text1%' OR 
      t.text LIKE '%text2%' OR 
      t.text LIKE '%text3%' OR 
      t.text LIKE '%text4%' OR 
      t.text LIKE '% text 5%' 
      ... 
      t.text LIKE '%text36%' 
     ); 

它可能不會有大的起色,但regexp可能會更快:

UPDATE table 
    SET delete = NULL 
    WHERE date > '2016-11-20' AND 
     t.text REGEXP 'text1|text2|text3| . . . |text36'; 

唯一有用的索引是date。我會建議table(date, text)date條件看起來很有選擇性。

最後,您可能會發現全文索引將在text上運行。這取決於實際執行的邏輯(例如,是「文本」模式字)。

0

試試這個

UPDATE table 
SET delete = NULL 
WHERE (date > '2016-11-20 00:00:00') AND (t.text LIKE '%text1%' 
OR t.text LIKE '%text2%' 
OR t.text LIKE '%text3%' 
OR t.text LIKE '%text4%' 
OR t.text LIKE '% text 5%' 
... 
... 
... 
... 
OR t.text LIKE '%text36%') 
+0

** LIKE'%text'**始終是全表掃描。所以你可以用索引加速它 –