如何使用 mysql 中的 'in' 子句优化从 select 中删除?

How to optimize delete from select with 'in' clause in mysql?

从 table 包含 100k 记录的文件中删除大约 90k 条记录 我这样做:

 delete from table1 where id in ( select id from table2 ) ; 

大约需要 30 分钟,如果我用某种编程语言动态构建相同的内容,它 运行 不到一分钟。

for i in (records to delete) 
        delete from table1 where id = i

如何优化本机 mysql 查询?

Mysql 对 IN 子查询不好,使用 exists

delete from table1 where exists ( select 1 from table2 WHERE table1.id=table2.id ) ; 

我建议您使用联接操作而不是 IN (subquery),并确保表 1 上有合适的索引(以 id 作为前导列)可用:

DELETE t1.*
  FROM table1 t1
  JOIN table2 t2
    ON t2.id = t1.id

编辑

我不确定为什么我的回答遭到否决。如果这是一个糟糕的答案,或者没有帮助,那么我希望就为什么这是一个糟糕的答案发表评论。

这个答案比我的大多数答案都简洁;我想我可以解释为什么合适的索引对于良好的性能是必要的。

OP 问题是如何 "optimize delete" 使用 col IN (subquery) 谓词。我认识到我未能提供关于 为什么 该模式会导致次优性能的解释; 为什么 连接操作有时会更有效。 OP 问 "how to optimize native sql query"...简短的回答是重新编写查询。

试试这个:

DELETE 
  table1.*
FROM 
  table1, table2
WHERE 
  table1.id = table2.id

或使用 JOIN。 尽可能避免 IN。