首页 > 解决方案 > MySQL如何优化DELETE的速度

问题描述

我有下表单词并存储英文单词。列是(id、word、type、explanation、example)。

这些词是从词汇表中抓取的,我的表中有很多重复的行。Words 表中的行数是 800k+,所以我想删除一些重复的行。不过在我看来,

第一步:创建一个名为“words_temp”的表,将“words”表中所有重复的单词插入“words_temp”;

步骤2:删除表“word_temp”中“word”列的行;

第三步:合并两张表;

以下是我的条款: 第 1 步:

INSERT INTO words_tmp 
   (SELECT * 
       FROM words 
       GROUP BY word 
       HAVING COUNT(word) > 1 );

第2步:

DELETE FROM words 
   WHERE word in (SELECT word FROM words_tmp);

但是“第 2 步”的速度很慢,我已经等了 10 分钟,但没有任何反应。谁能告诉我如何优化我的 SQL 子句?

标签: mysqlsql

解决方案


您可以尝试使用以下方法删除它们:

delete w
    from words w join
         (select w.word, min(w.id) as min_id
          from words w
          group by w.word
         ) ww
         on w.word = ww.word and w.id > ww.min_id;

这假设它id是唯一的。您可以使用 上的索引来加快速度words(word, id)

也就是说,最有效的方法通常是清空表并重新填充它:

create table temp_words as
    select w.*
    from words w
    where w.id > (select min(w2.id) from words w2 where w2.word = w.word);

然后,截断原始表并重新插入(确保在尝试此操作之前已将原始表的副本存储在某处!):

truncate table words;

insert into words
    select w.*
    from temp_words;

与 s 相比,插入的锁定和日志记录要少得多delete,因此这通常会加快此类过程。


推荐阅读