>从包含 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查询?
我建议您使用连接操作而不是IN (subquery)
,并确保在表1上提供合适的索引(以id
为前导列):
DELETE t1.*
FROM table1 t1
JOIN table2 t2
ON t2.id = t1.id
编辑
我不确定为什么我的回答得到了反对票。如果这是一个糟糕的答案,或者没有帮助,那么我有点期待关于为什么这是一个糟糕的答案的评论。
这个答案比我的大多数答案都简洁;我想我可以解释为什么合适的指数对于良好的表现是必要的。
OP 问题是如何"优化删除"使用col IN (subquery)
谓词。我承认我未能解释为什么这种模式会导致次优性能;以及为什么联接操作有时可以更有效。OP问"如何优化原生SQL查询"... 简短的回答是重写查询。
Mysql 对 IN 子查询不好,使用存在
delete from table1 where exists ( select 1 from table2 WHERE table1.id=table2.id ) ;
试试这个:
DELETE
table1.*
FROM
table1, table2
WHERE
table1.id = table2.id
或使用加入。尽可能避免IN。