2015-01-13 34 views
0

删除从表中各地90K记录包含100K记录我做的:如何使用mysql中'in'子句的select来优化删除?

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

大约需要30分钟,如果你建造相同dynamiclly一些它在不到一分钟的运行编程语言。

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

如何优化原生mysql查询?

+0

table2中有多少条记录?无论你做什么,“身份证号码(吨,吨和吨数)都会变慢。 –

回答

1

我建议你使用一个连接操作,而不是IN (subquery),并确保合适的索引(与id作为前导列)可在表1 :

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

编辑

我不知道为什么我的答案收到了一个downvote。如果这是一个不好的答案,或者是无益的,那么我会期待评论为什么这是一个不好的答案。

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

OP问题是如何“优化删除”使用了一个col IN (subquery)谓词。我承认我没有提供解释,因为为什么这种模式会导致次优的表现;和为什么连接操作有时可以更有效率。 OP询问“如何优化原生SQL查询”......简短的答案是重新编写查询。

0

MySQL是坏,在子查询,使用存在

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

试试这个:

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

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

+3

你的例子是一个隐含的'JOIN',自1992年以来已被弃用。http://en.wikipedia.org/wiki/Join_%28SQL%29 –