我有两个MySQL查询,它们都将数据插入表中。两者都具有以下格式:
CREATE TABLE IF NOT EXISTS `data` (
`id` BIGINT NOT NULL AUTO_INCREMENT UNIQUE,
PRIMARY KEY (`id`)
)
SELECT `field1`, `field2`
WHERE `active` = 1
两个查询之间的唯一区别是如何确定field1
和field2
,以及条件子句中的一些细微差别。两者都达到12K和更多记录。
现在,效率会更高:
一个。分别运行两个查询:
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函数,可根据某些规范更改字段数据。
答案 0 :(得分:1)
Aaronmccall的回答可能是最好的 - UNION方法在一次SQL调用中完成所有操作。一般而言,这将是最“有效”的,但可能存在可能发挥作用的副作用,并影响您的特定应用的“有效”措施。
具体来说,如果UNION需要一个临时表来收集中间结果,并且您正在使用非常大的数据集,那么在新表中执行两个单独的直接SELECT可能会在您的特定情况下更有效。这取决于数据库引擎内部的工作,完成的优化等(可能会根据您使用的数据库引擎的版本而改变)。
最终,在这样一个特定问题上回答你问题的唯一方法可能是为你的特定应用和环境做好时机。
你也可能想要考虑两个独立查询所需的时间与“一体化”查询所需的时间之间的差异在宏观方案中可能是微不足道的......你可能正在谈论一些差异毫秒(甚至微秒?),除非您的mysql数据库位于具有巨大延迟问题的单独服务器上。如果你一次性完成数以千计的这些调用,那么差异可能很大,但是如果你只做了一两个这样的调用而你的应用程序花了99.99%的时间执行其他事情,那么差异就是两个人可能甚至都不会被注意到。
---劳伦斯
答案 1 :(得分:0)
你的选择做了不同的事情。如果第一个查询正确执行,则第一个返回第二个查询的结果(BTW独立于它返回的结果,它可以返回一个空行集)。第二个返回第一个查询和第二个查询的结果。第一个选项对我来说似乎很无用,可能你想要实现的就是你对UNION的所作所为(除非我不理解你)。
编辑:阅读完评论后,我认为你是在追求这样的事情:
SELECT true where(EXISTS(SELECT field1,field2 ...)AND EXISTS(SELECT Field1,field2 ...))。
这样你只有一个查询数据库,它可以更好地扩展,从连接池中获取更少的资源,并且如果你将数据库引擎放在不同的服务器上,则不会使延迟的影响增加一倍,但你仍然会如果第一个条件失败,则中断查询,这是您使用嵌套的分离查询查找的性能改进。
作为优化,尝试首先使条件更快地执行,以防它们不相同。我假设如果其中一个要求那些字段计算会更慢。
答案 2 :(得分:0)
UNION方法肯定会更快,因为花费两个来自php的mysql api调用的费用。