1

我有两个 MySQL 查询,它们都将数据插入到表中。两者都具有以下格式:

CREATE TABLE IF NOT EXISTS `data` (
`id` BIGINT NOT NULL AUTO_INCREMENT UNIQUE,
PRIMARY KEY (`id`)
)
SELECT `field1`, `field2`
WHERE `active` = 1

两个查询之间的唯一区别是如何确定field1field2确定,以及条件子句中的一些细微差别。两者都运行高达 12K 和更多的记录。

现在,什么会更有效:

A. 分别运行两个查询:

if (mysql_query($query1)) {
    return mysql_query($query2);
}
return false;

B. 或将这两个查询与 UNION 组合,并运行一次:

$query = 'SELECT `field1`, `field2` WHERE `active` = 1
            UNION 
            SELECT DO_ONE(`field1`), DO_TWO(`field2`) WHERE `active` = 1
            ORDER BY `field1`';
return mysql_query('CREATE TABLE IF NOT EXISTS `data` (
`id` BIGINT NOT NULL AUTO_INCREMENT UNIQUE,
PRIMARY KEY (`id`)
) ' . $query)

如果没有来自另一个查询的数据,来自一个查询的数据是无用的,因此两者都需要成功。DO_ONE并且DO_TWO是用户定义的 MySQL 函数,可根据某些规范更改字段数据。

4

3 回答 3

1

Aaronmccall 的答案通常可能是最好的——UNION 方法在一个 SQL 调用中完成所有工作。一般来说,这将是最“有效”的,但可能会出现一些副作用,并影响您特定应用程序的“有效”衡量标准。

具体来说,如果 UNION 需要一个临时表来收集中间结果并且您正在处理非常大的数据集,那么在您的特定情况下对新表执行两个单独的直接 SELECT 可能会更有效。这将取决于数据库引擎中的内部工作、完成的优化等(这可能会根据您使用的数据库引擎的版本而改变)。

最终,就这样的特定问题回答您的问题的唯一方法可能是为您的特定应用程序和环境进行计时。

您可能还想考虑两个单独查询与“一体式”查询所需的时间之间的差异在总体方案中可能是微不足道的......您可能正在谈论几毫秒的差异(或甚至是微秒?)除非您的 mysql 数据库位于具有巨大延迟问题的单独服务器上。如果您一次执行数千个这样的调用,那么差异可能很大,但是如果您只执行其中一两个调用并且您的应用程序花费 99.99% 的时间执行其他操作,那么两者之间的差异两个可能甚至不会被注意到。

---劳伦斯

于 2009-05-15T17:42:56.620 回答
0

你的选择做不同的事情。如果第一个查询正确执行,则第一个查询返回第二个查询的结果(顺便说一句,它独立于它返回的结果,它可以返回一个空行集)。第二个将第一个查询和第二个查询的结果一起返回。第一个选项在我看来毫无用处,可能你想要实现的是你对 UNION 所做的(除非我误解了你)。

编辑:阅读你的评论后,我认为你是这样的:

SELECT true where (EXISTS(SELECT field1, field2 ...) AND EXISTS (SELECT Field1, field2 ...))。

这样,您将只有一个对数据库的查询,它可以更好地扩展,从连接池中占用的资源更少,并且如果您将数据库引擎放在不同的服务器上,延迟的影响不会加倍,但您仍然会中断查询如果第一个条件失败,这就是您使用嵌套分离查询寻找的性能改进。

作为一种优化,尝试首先获得执行速度更快的条件,以防它们不一样。我假设如果其中一个需要这些字段计算会更慢。

于 2009-05-15T12:40:52.057 回答
0

UNION 方法肯定会更快,因为从 php 调用两次 mysql api 调用相对于一次调用。

于 2009-05-15T14:12:41.337 回答