Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 子查询从表中删除记录的substitute_Mysql_Sql_Database_Oracle - Fatal编程技术网

Mysql 子查询从表中删除记录的substitute

Mysql 子查询从表中删除记录的substitute,mysql,sql,database,oracle,Mysql,Sql,Database,Oracle,我使用此查询从一个表中删除唯一记录 DELETE FROM TABLE 1 WHERE ID NOT IN (SELECT ID form TABLE 2) 但问题是这两个表都有数百万条记录,使用子查询将非常缓慢 有人能告诉我其他的选择吗。子查询实际上非常慢 Delete t1 from table_1 t1 left join table_2 t2 on t1.id = t2.id where t2.id is null 从表中删除数百万条记录总是有性能问题;你需要检查一下桌子上是否有

我使用此查询从一个表中删除唯一记录

DELETE FROM TABLE 1 WHERE ID NOT IN (SELECT ID form TABLE 2) 
但问题是这两个表都有数百万条记录,使用子查询将非常缓慢


有人能告诉我其他的选择吗。

子查询实际上非常慢

Delete t1 
from table_1 t1
left join table_2 t2 on t1.id = t2.id
where t2.id is null

从表中删除数百万条记录总是有性能问题;你需要检查一下桌子上是否有- 1.约束条件 2.触发器& 3.索引

在上面。这些东西会让你的删除速度更慢

请在此活动之前禁用它们。您还应该检查“待删除”记录与整个表卷的比率。如果要删除的记录数超过整个表卷的50%,那么您应该考虑下面的方法-

  • 创建一个临时表,其中包含要从原始表中保留的记录
  • 放下原来的桌子
  • 将临时表重命名为原始表
  • 在使用上述方法之前,请确保您拥有依赖于此原始表的每个对象(如约束、索引、触发器等)的定义副本。您可能还需要检查要删除的表是否有子表

    完成此活动后,您可以再次启用约束、索引和触发器

    谢谢,
    Aditya取决于您的索引策略。MySQL不是优化了
    不在
    中的反连接,使其与
    外部连接/为空的
    一样高效吗?请参阅:“算法实际上是相同的……并且查询在同一时间完成。”。禁用索引时要小心:有些可能会大大加快此操作。禁用约束和触发器时也要小心:它们可能对保持数据一致性至关重要。谢谢您的评论。看看这个问题,我认为用户想要删除数百万条记录,而删除如此巨大的记录并不是每天都会发生。。这就是我假设它是一次性活动的原因,并建议禁用索引和约束,但是相应表中
    id
    上的索引将起到极大的帮助。禁用这些索引将是一个糟糕的想法。我们在项目中实现了这种方法,同时在浏览完此链接后清除了其中一个表-我没有在其中添加,即一旦一次性删除活动完成,我们需要启用所有内容。
    DELETE table1 
    FROM table1 LEFT JOIN table2 ON table1.id = table2.id
    WHERE table2.id is null