我想用可能重叠的数据填充表格。我在代码中做了几次。所以,第一次

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将代码更改为只插入一次,但这需要大量的重新设计,所以我想知道我现在受到了多大的性能损失
谢谢!!

最佳答案

工会的成本可能更低。但和数据库一样,这取决于。
为什么?
因为你现在所做的是:
扫描表B并插入A。
扫描表C并插入A(其中不存在)。
扫描表D并插入A(其中不存在)。
有了工会,你就会这样做:
扫描表B。
扫描表C。
扫描表D。
将唯一值插入表A。
即,您当前的查询扫描表B、C、D和表A两次,外加三个独立查询的开销。联合查询将扫描表B、C、D并对行进行排序(以获得唯一的值),然后将它们插入表A中。乍一看,联合似乎更快,因为您只执行两次较少的扫描和一次插入(从而减少了锁定)。
我所说的取决于:
索引:正确的索引,查找可能比从B、C和D排序数据快。
数据量:如果与运行数据库的硬件相比,您的数据很少,那么这个讨论可能毫无意义。也就是说,没有必要优化不是瓶颈的部件。

关于mysql - 在mysql中,NOT EXISTS函数是否比UNION代价高得多?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7089529/

10-12 00:10
查看更多