mysql - 优化数百万行的 "NOT IN(...)"查询

标签 mysql query-optimization

注意:我无权访问此问题所属的源代码/数据库。有问题的两个表位于不同服务器上。

我正在与一家第三方公司合作,该公司的系统与我们自己的系统集成。他们有一个运行类似这样的查询;

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/

相关文章:

php - 如何使用单个查询更新具有相同记录字段的记录?

mysql - mysql表的重新计数或缓存计数

MySQL:如何优化这个查询?

mysql - 使用 JOIN 优化 MySQL 计数查询

mysql - 使用 JOIN 子句的 LIMIT 行为

c# - 如何为表中的多行插入编写参数化查询?

SQL替换成问题

mysql - 在大表中查找半径MySQL(纬度经度)内的点的最快方法是什么

mysql - 在 MySQL 中,SUBSTRING(1, 200) 是否比获取 TEXT 列的完整值更好?

mysql - 防止重复 key 更新时跳过自动增量