使用另一个表从表中删除记录?

时间:2009-09-17 04:46:24

标签: php mysql database optimization query-optimization

注意:编辑:如果有更好的标题,请编辑标题:)

我的问题是:

我的数据库中有两个表

     -----------
     | table1   |
     |----------|
     | id       |
     |text      |
     ===========


     -----------
     | table2   |
     |----------|
     | id       |
     |text      |
     ===========

table1是600,000条记录

table2是5,000,000条记录!! :)

删除table2中不在table1

中的所有记录的最佳方法是什么

我主要是顺便 - 最快的方式,因为我不想等待4个小时才能完成这个过程

你有比以下代码更好的东西:

<?PHP
   $sql = "select text from table2";
   $result = mysql_query($sql) or die(mysql_error());
   while($row = mysql_fetch_array($result)){
        $text = $row["text"];
        $sql2 = "select id from table1 where text = '$text'";
        $query2 = mysql_query($sql2) or die(mysql_error());
        $result2 = mysql_num_rows($query2);
        if($result2==0){
             $sql3 = "delete from table2 where text = '$text'";
             $query3 = mysql_query($sql3) or die(mysql_error());
        }
   }
?>

由于

5 个答案:

答案 0 :(得分:5)

让RDBM处理它怎么样?

例如

DELETE FROM table2 WHERE text NOT IN (select distinct text from table1)

干杯

PS:在测试前做一些备份......

答案 1 :(得分:3)

你的解决方案在table2表中每行执行2次查询 - 这意味着几百万次查询 - 这将是相当慢的^^

使用MySQL,您可能只能在一个查询中删除所有这些:DELETE指令可用于从多个表中删除数据。

首先要编写与您要删除的数据匹配的选择指令(这是一种更好的测试方法,而不是尝试删除而不知道它是否真的会处理正确的数据);这样的事情可能会这样做:

select table2.*
from table2
    left join table1 on table1.text = table2.text
where table1.id is NULL

这应该可以获取table2中的所有数据,但不在table1中。

一旦确定此查询获得了正确的数据,就可以将其转换为删除查询:

delete table2
from table2
    left join table1 on table1.text = table2.text
where table1.id is NULL

这可能会 - 当然,最好首先测试一个测试数据库,而不是测试数据库!

否则,带有IN和子查询的东西可能会这样做;有点像

delete
from table2
where text not in (select text from table1)

不确定什么会更快,但是,考虑到你拥有的数据量 - 无论哪种方式,我都不会做你提出的那种PHP循环,但会使用可以自行删除所有内容的SQL查询:避免从PHP到数据库的所有调用肯定会让事情变得更快!

答案 2 :(得分:1)

为什么不向table2添加一个新字段,该字段是一个字节,然后只是将该字节更新设置为true,如果该行在两个表中,则为“Y”。

然后,只删除没有这一列的行。

这似乎是最简单,最快的IMO。

答案 3 :(得分:1)

试试这个:

DELETE table2 Where id NOT IN (SELECT id from table1)

注意:在运行查询之前进行备份

答案 4 :(得分:0)

像table2一样创建table3 插入table3(SELECT table2.ID,TABle2.TEXT从table1连接table2 on ...) drop table2 alter table3 new name table2

涉及一些管理(因此,如果您可以轻松删除/更改表,它只是一个有效的选项),但至少DML部分将胜过任何其他选项,这是不可能的。

相关问题