在mysql中,NOT EXISTS函数的性能成本是否比UNION高很多?

在mysql中,NOT EXISTS函数的性能成本是否比UNION高很多?,mysql,performance,union,exists,Mysql,Performance,Union,Exists,我想用可能重叠的数据填充一个表。我在代码中这样做过几次。所以,第一次是 INSERT INTO A (SELECT * FROM B) INSERT INTO A SELECT * FROM C WHERE NOT EXISTS (SELECT * FROM A Where A.field = C.field) 第二次是 INSERT INTO A (SELECT * FROM B) INSERT INTO A SELECT * FROM C WHERE NOT EXISTS (SELEC

我想用可能重叠的数据填充一个表。我在代码中这样做过几次。所以,第一次是

INSERT INTO A (SELECT * FROM B)
INSERT INTO A
SELECT * FROM C
WHERE NOT EXISTS (SELECT * FROM A Where A.field = C.field)
第二次是

INSERT INTO A (SELECT * FROM B)
INSERT INTO A
SELECT * FROM C
WHERE NOT EXISTS (SELECT * FROM A Where A.field = C.field)
重新插入总共进行了3次。我可以在4个子表上使用并集将代码更改为一次插入,但这需要大量的重新设计,所以我想知道我现在受到了多大的性能损失


谢谢

如果目标表中有合适的唯一键约束,您可能还需要查看
INSERT IGNORE…


只是另一个想法。。。但是,不知道性能差异,这可能取决于表结构、索引和数据。我只需要自己对不同的方法进行基准测试,然后选择最合适的方法。

如果目标表中有合适的唯一键约束,您可能还需要查看
INSERT IGNORE…


只是另一个想法。。。但是,不知道性能差异,这可能取决于表结构、索引和数据。我会自己对不同的方法进行基准测试,然后选择最合适的方法。

工会的成本可能更低。但和数据库一样,这要视情况而定

为什么?

因为你现在正在做的是:

  • 扫描表B并插入A
  • 扫描表C并插入A(不存在的地方)
  • 扫描表D并插入A(不存在的地方)
  • 有了工会,你就可以做到这一点:

  • 扫描表B
  • 扫描表C
  • 扫描表D
  • 在表A中插入唯一值
  • 即,您当前的查询将扫描表B、C、D和表A两次,外加三个单独查询的开销。union查询将扫描表B、C、D,并对行进行排序(以获得唯一值),然后将它们插入表A。乍一看,union似乎会更快,因为您只需执行两次扫描和一次插入(从而减少锁定)

    我的意思取决于:

    索引:索引正确,查找可能比从B、C和D中排序数据更快


    数据量:如果与运行数据库的硬件相比,您的数据很少,那么这个讨论可能毫无意义。也就是说,优化不是瓶颈的部件没有意义。

    一个联合体的成本可能更低。但和数据库一样,这要视情况而定

    为什么?

    因为你现在正在做的是:

  • 扫描表B并插入A
  • 扫描表C并插入A(不存在的地方)
  • 扫描表D并插入A(不存在的地方)
  • 有了工会,你就可以做到这一点:

  • 扫描表B
  • 扫描表C
  • 扫描表D
  • 在表A中插入唯一值
  • 即,您当前的查询将扫描表B、C、D和表A两次,外加三个单独查询的开销。union查询将扫描表B、C、D,并对行进行排序(以获得唯一值),然后将它们插入表A。乍一看,union似乎会更快,因为您只需执行两次扫描和一次插入(从而减少锁定)

    我的意思取决于:

    索引:索引正确,查找可能比从B、C和D中排序数据更快

    数据量:如果与运行数据库的硬件相比,您的数据很少,那么这个讨论可能毫无意义。也就是说,优化不是瓶颈的部件没有意义