MySQL:使用未使用的表加入会增加执行时间吗?

时间:2015-07-16 07:52:44

标签: mysql sql

假设t是一个大表,并且以下两个查询

SELECT t1.value, t2.value 
FROM t as t1 JOIN t as t2
ON t1.id = t2.id 
WHERE t1.key = '123'

SELECT t1.value, t2.value 
FROM t as t1 JOIN t as t2 JOIN t as t3
ON t1.id = t2.id
WHERE t1.key = '123'

第二个具有JOIN的表,该表没有在SELECT中使用。

第二个查询执行得慢得多。我预计MySQL会发现第三个JOIN没有被使用,只会忽略它。但它没有?

3 个答案:

答案 0 :(得分:1)

这是因为mySQL中的默认JOIN意味着INNER JOIN。 第三个连接将不会被忽略,因为这将改变您在执行查询后返回的最终数据集。

This stackoverflow question contains more detailed information

答案 1 :(得分:1)

您的第二个查询没有第二个联接的ON子句:

SELECT t1.value, t2.value 
FROM t as t1 
JOIN t as t2 
JOIN t as t3 ON t1.id = t2.id
WHERE t1.key = '123';

这意味着t1中的每个匹配记录都将连接到t2中的每个记录。也许这就是你的意思:

SELECT t1.value, t2.value 
FROM t as t1 
JOIN t as t2 ON t1.id = t2.id 
JOIN t as t3 ON t1.id = t3.id
WHERE t1.key = '123';

这样做会更合理,因为它不会产生大量的结果。

如果您打算在t3上完全加入:

SELECT t1.value, t2.value 
FROM t as t1 
JOIN t as t2 ON t1.id = t2.id 
JOIN t as t3
WHERE t1.key = '123';

然后这将会变慢,因为即使你没有从t3中选择一个字段,它也会改变输出,因为它会产生额外的行。

请参阅此处查看示例http://sqlfiddle.com/#!9/e86c9/3

答案 2 :(得分:1)

并不是MySQL优化器不够智能去除未使用的查询,只是你在这里使用了错误的语法。如文档所述,您的查询将按以下方式执行:

JOIN t as t2 JOIN t as t3 --> t2 CROSS JOIN t3

您使用的语法不是标准SQL,不能在任何符合SQL标准的数据库中使用。看一下具体的MySQL JOIN文档here