Mysql 为什么这个查询会使我的整个数据库冻结?
您缺少任何将表相互关联的连接条件,因此正在执行3个表的笛卡尔连接 我建议始终使用显式连接语法Mysql 为什么这个查询会使我的整个数据库冻结?,mysql,sql,database,Mysql,Sql,Database,您缺少任何将表相互关联的连接条件,因此正在执行3个表的笛卡尔连接 我建议始终使用显式连接语法 SELECT * FROM `groupon-spain-6sep-2011`, `Hoja1`,`GroupaliaJuly2011` WHERE `groupon-spain-6sep-2011`.`code`= 5654 OR `Hoja1`.`code` = "5654 OR `GroupaliaJuly2011`.`code` = 5654 尽管您可能希望在这里建立一
SELECT * FROM `groupon-spain-6sep-2011`, `Hoja1`,`GroupaliaJuly2011`
WHERE `groupon-spain-6sep-2011`.`code`= 5654
OR `Hoja1`.`code` = "5654
OR `GroupaliaJuly2011`.`code` = 5654
尽管您可能希望在这里建立一个联合,但我认为无论如何?您提出的查询涉及三个表的笛卡尔积(在标准SQL中也称为交叉连接,感谢@onedaywhen)的建议,所涉及的记录量将是大小(a)*大小(B)*大小(C)。因此,如果整个产品足够大,它将填充大量内存,这将使您的数据库无法响应任何其他请求,这将导致数据库“冻结”
我注意到您希望三个指定的列中的任何一个都是相同的值“5654”,因此您可以分别从三个表中选择元组,然后合并它们,而不是像现在这样对它们进行笛卡尔积,因为我认为您所做的笛卡尔积没有任何意义。这将节省大量内存。您可能需要执行联合:
SELECT *
FROM `groupon-spain-6sep-2011`
JOIN `hoja1` ON `groupon-spain-6sep-2011`.foo=`hoja1`.foo
JOIN `groupaliajuly2011` ON `groupaliajuly2011`.`foo` = `hoja1`.foo
WHERE `groupon-spain-6sep-2011`.`code` = 5654
OR `hoja1`.`code` = 5654
OR `groupaliajuly2011`.`code` = 5654
您编写的连接样式SQL与OP具有不同的含义。不能推断所涉及的列是OP的SQL中的外键。满足OP的SQL的元组只需要有一列等于“5654”,其他两列可以是任何东西,更不用说相等了。@Spirit-当然它有不同的含义。OP正在进行无意的交叉连接!我的回答演示了使用任意列名的联接语法,因为我们没有关于表结构或关系的信息。根据表名,我怀疑他们可能需要
UNION
而不是JOIN
,正如我最后一行建议的那样。同意。也许SQL的笛卡尔乘积形式对于像OP这样的SQL新手来说似乎是一种联合操作。我怀疑SQL新手也会知道“笛卡尔乘积”的含义。+1但我想他可能也想知道“冻结”数据库的原因,这在我的回答中已经说明了。@Spirit Zang:是的。您和Martin都回答了这个问题,所以我不需要=)因此您需要+1。当然,您不应该使用select*(如果表具有不同的结构,那么它在联合中就不起作用)。OP也应该考虑工会是否会以更快的速度运作。但只有当所有记录都不能在多个表中时,它才会起作用。第一段很清楚,并回答了原因。第二个,不多。如何组合元组?在某种程度上,他已经在这样做了,将元组组合起来。如果您想使用联合
,请编写它。@ypercube。我没有使用“联合”这个词,因为我不太确定他/她是否希望这样做。不管怎样,你的建议让它更清楚了。+1但我怀疑SQL新手会知道“笛卡尔乘积”是什么意思,除非他们有数学背景,即使这样,关系笛卡尔乘积也是不同的。你能用另一个词吗。例如,标准SQL调用它交叉连接。@onedaywhen-不幸的是在MySQL中,这有点混淆了这里的问题。@Martin Smith:我不知道!MySQL的古怪世界,嗯?看起来您已经了解了SQL-92之前标准联接语法的所有危险:)这就是隐式联接语法是反模式的原因。
SELECT *
FROM groupon-spain-6sep-2011
WHERE code = 5654
UNION SELECT *
FROM Hoja1
WHERE code = 5654
UNION SELECT *
FROM GroupaliaJuly2011
WHERE code = 5654