为什么这个查询使我的整个数据库冻结?

时间:2011-09-16 08:59:39

标签: mysql sql database

SELECT * FROM `groupon-spain-6sep-2011`, `Hoja1`,`GroupaliaJuly2011` 
WHERE `groupon-spain-6sep-2011`.`code`= 5654 
    OR  `Hoja1`.`code` = "5654 
    OR `GroupaliaJuly2011`.`code` = 5654

3 个答案:

答案 0 :(得分:9)

您缺少任何将表格相互关联的连接条件,因此正在进行3个表格的笛卡尔连接。

我建议始终使用显式连接语法

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  

虽然你可能想要一个联盟在这里,但我想呢?

答案 1 :(得分:6)

您提出的查询涉及三个表的笛卡尔积(在标准SQL中也称为CROSS JOIN,感谢@onedaywhen的建议),涉及的记录量将是大小(A)*大小(B)*大小(C)。因此,如果总产品足够大,它将填充大量内存,这将使您的数据库无法响应任何其他请求,这将导致数据库的“冻结”。

我注意到你想要三个指定列中的任何一个是相同的值'5654',所以你可以分别从三个表中选择元组,然后UNION它们,而不是像你正在做的那样做它们的笛卡尔积现在,因为我不认为你制作的笛卡尔产品有任何意义。这将节省大量的内存。

答案 2 :(得分:6)

您可能希望改为使用联盟:

SELECT * 
    FROM groupon-spain-6sep-2011
    WHERE code = 5654
UNION SELECT * 
    FROM Hoja1
    WHERE code = 5654
UNION SELECT * 
    FROM GroupaliaJuly2011
    WHERE code = 5654