mysql - 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 子句?
解决方案
您可以尝试使用以下方法删除它们:
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
,因此这通常会加快此类过程。
推荐阅读
- swift - 使用 viewdidload 在 UIView 中显示一些元素
- gatsby - Gatsby 将 javascript frontmatter 与 allSitePage 查询相结合
- lua - 使三次缓入曲线动态切换其目标位置
- unity3d - 我仍然不明白为什么将一个简单的小型预制件从一个项目复制到另一个项目如此困难?
- css - 为什么我的活动 li 比悬停的 li 大?
- c# - FirstOrDefaultAsync() & SingleOrDefaultAsync() vs FindAsync() EFCore
- java - java.io.FileNotFoundException: C:\Engines\Data.xlsx(系统找不到指定的文件)
- c - 如何从 ps 中隐藏 execl() 参数?
- php - 翻译 Laravel 中的 HTML 标签
- sql-server - 重新排列表(仅汇总某些行)