Php 是否使用其他表从表中删除记录?

Php 是否使用其他表从表中删除记录?,php,mysql,database,optimization,query-optimization,Php,Mysql,Database,Optimization,Query Optimization,注意:编辑:如果有更好的标题,请编辑标题: 我的问题是: 我的数据库中有两个表 ----------- | table1 | |----------| | id | |text | =========== ----------- | table2 | |----------| | id | |text | ========

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

我的问题是:

我的数据库中有两个表

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


     -----------
     | table2   |
     |----------|
     | id       |
     |text      |
     ===========
表1是600000条记录

表2是5000000条记录!!:

删除表2中所有不在表1中的记录的最佳方法是什么

顺便说一句,这是最快的方法,因为我不想等待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());
        }
   }
?>

谢谢

让RDBM来处理怎么样

比如说

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


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

让RDBM来处理怎么样

比如说

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


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

为什么不在表2中添加一个新的一个字节的列,然后将该字节更新为true或“Y”(如果该行在两个表中)

然后,只需删除没有设置这一列的行


这似乎是最简单和最快的,我想。

为什么不在表2中添加一个新的一个字节的列,然后将该字节更新为true或“Y”(如果该行在两个表中)

然后,只需删除没有设置这一列的行


依我看,这似乎是最简单、最快的方法。

您的解决方案是在table2表中每行执行2个查询,这意味着数百万个查询,这将相当缓慢^^

使用MySQL,您可以在一个查询中删除所有这些内容:该指令可用于从多个表中删除数据

第一件事是编写与要删除的数据相匹配的select指令,这是一种比在不知道是否真正处理正确数据的情况下尝试删除更好的测试方法;这样做可能会:

select table2.*
from table2
    left join table1 on table1.text = table2.text
where table1.id is NULL
这将获得表2中的所有数据,但不在表1中

确定此查询获取的数据正确后,可以将其转换为删除查询:

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到DB的调用肯定会让事情更快

您的解决方案是在table2表中每行执行2个查询,这意味着有几百万个查询,这将非常缓慢^^

使用MySQL,您可以在一个查询中删除所有这些内容:该指令可用于从多个表中删除数据

第一件事是编写与要删除的数据相匹配的select指令,这是一种比在不知道是否真正处理正确数据的情况下尝试删除更好的测试方法;这样做可能会:

select table2.*
from table2
    left join table1 on table1.text = table2.text
where table1.id is NULL
这将获得表2中的所有数据,但不在表1中

确定此查询获取的数据正确后,可以将其转换为删除查询:

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到DB的调用肯定会让事情更快

试试这个:

DELETE table2 Where id NOT IN (SELECT id from table1)
注意:在运行查询之前进行备份

尝试以下操作:

DELETE table2 Where id NOT IN (SELECT id from table1)
注意:在运行查询之前进行备份

创建类似于表2的表3 插入到表3中选择表2.ID,表2.TEXT从表1连接表2在。。。 下表2 更改表3新名称表2

需要一点管理,所以如果您可以轻松地删除/更改表,这只是一个有效的选项,但至少DML部分的性能会优于任何其他选项,我认为。

像表2一样创建表3 插入到表3中选择表2.ID,表2.TEXT从表1连接表2在。。。 下表2 更改表3新名称表2


需要一点管理,所以如果您可以轻松地删除/更改表,这是一个有效的选项,但至少DML部分的性能优于任何其他选项,我想。

删除如此大量的记录会使事务日志溢出吗?取决于他是否进行了事务处理,但如果“是”,则事务记录会大大增加。删除如此大量的记录会使事务日志溢出吗?取决于他是否进行了事务处理,但如果“是”,则事务记录会大大增加增长