在mysql中,NOT EXISTS函数比UNION的性能要贵得多吗?

时间:2011-08-17 08:00:45

标签: 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)

重新插入共进行3次。我可以在4个子表上使用UNION将代码更改为一次插入,但是需要进行大量的重新设计,所以我想知道我现在正在接受多少性能损失

谢谢!

2 个答案:

答案 0 :(得分:1)

工会的成本可能更低。但与数据库一样,取决于

为什么?

因为你现在正在做的是:

  1. 扫描表格B并插入A。
  2. 扫描表格C并插入A(不存在)。
  3. 扫描表格D并插入A(不存在)。
  4. 通过工会,您可以这样做:

    1. 扫描表B.
    2. 扫描表C.
    3. 扫描表D.
    4. 向表A插入唯一值。
    5. 即。您当前的查询扫描表B,C,D和表A两次加上三次单独查询的开销。联合查询将扫描表B,C,D,并对行进行排序(以获取唯一值),然后将它们插入到表A中。乍一看似乎联合会更快,因为您减少了两次扫描并且只有一个插入(因此锁定较少)。

      我所说的取决于是:

      索引:正确索引,搜索可能比从B,C和D排序数据更快。

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

答案 1 :(得分:0)

如果目标表中有合适的UNIQUE KEY约束,您可能还需要查看INSERT IGNORE ...

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