注意:我无权访问此问题所属的源代码/数据库。有问题的两个表位于不同服务器上。
我正在与一家第三方公司合作,该公司的系统与我们自己的系统集成。他们有一个运行类似这样的查询;
DELETE FROM table WHERE column NOT IN(1,2,3,4,5,.....3 000 000)
它几乎引用了 NOT IN
中大约 300 万个值。
我试图指出,这似乎是删除多行并保留查询中记录的所有行的低效方法。问题是,由于我自己无法访问源代码/数据库,所以我不完全确定建议的解决方案是什么。
我知道这个查询的想法是让目标服务器与源服务器保持同步。因此,如果在源服务器上删除一行,则运行此(和其他)查询时目标服务器将反射(reflect)该更改。
凭借有限的知识,我可以向他们提出哪些可能的建议?
首先想到的是某种标志列来指示它是否已被删除。当同步脚本运行时,它将首先在目标服务器上对标记为已删除的所有行执行更新(或插入新行),然后执行第二个查询以删除标记为删除的所有行。
考虑到功能上的彻底修改是不可能的,是否有更合乎逻辑的方法来做这样的事情。由于多种原因,只能对当前流程进行小幅调整。
最佳答案
而不是
DELETE FROM your_table
WHERE column NOT IN(1,2,3,4,5,.....3 000 000)
你可以做
delete t1
from your_table t1
left join table_where_the_ids_come_from t2 on t1.column = t2.id
where t2.id is null
关于mysql - 优化数百万行的 "NOT IN(...)"查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40629441/