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

Posted

技术标签:

【中文标题】在 mysql 中,NOT EXISTS 函数的性能成本是不是比 UNION 高得多?【英文标题】:in mysql, is the NOT EXISTS function much more performance costly than UNION?在 mysql 中,NOT EXISTS 函数的性能成本是否比 UNION 高得多? 【发布时间】:2011-08-17 08:00:44 【问题描述】:

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

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

谢谢!!

【问题讨论】:

***.com/questions/7077172/… 【参考方案1】:

联合可能成本更低。但与数据库一样,这取决于

为什么?

因为你现在正在做的是:

    扫描表 B 并插入 A。 扫描表 C 并插入 A(不存在的地方)。 扫描表 D 并插入 A(不存在的地方)。

有了工会,你会这样做:

    扫描表 B. 扫描表 C. 扫描表 D. 向表 A 中插入唯一值。

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

我的意思是取决于是:

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

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

【讨论】:

【参考方案2】:

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

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

【讨论】:

以上是关于在 mysql 中,NOT EXISTS 函数的性能成本是不是比 UNION 高得多?的主要内容,如果未能解决你的问题,请参考以下文章

十一在项目中操作MySQL

十一在项目中操作MySQL

如何在mysql中查询以某个字符开头的表 如何在mysql中查询以某个字符开头的表

MySQL:无法在 MySQL 视图中插入

mysql创建布尔字段

PHP/mysql:使用数组查询 MySQL 并在数组中获取结果