2016-11-20 45 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'**始终是全表扫描。所以你可以用索引加速它 –