假设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'第二个表具有一个连接,该表在SELECT中没有使用。
第二个查询执行速度要慢得多。我预期MySQL会发现第三个联接没有被使用,因此会忽略它。但事实并非如此?
发布于 2015-07-16 08:11:36
第二个查询没有第二个联接的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';这样做的速度会慢一些,因为即使您不是SELECTing,但它确实会更改输出,因为它会产生额外的行。
参见这里的示例http://sqlfiddle.com/#!9/e86c9/3
发布于 2015-07-16 07:58:23
这是因为mySQL中的默认INNER JOIN意味着INNER JOIN。第三个联接不会被忽略,因为这将改变执行查询后返回的最终数据集。
发布于 2015-07-16 08:37:24
这并不是因为MySQL优化器不够聪明,无法删除未使用的查询,而是因为您在这里使用了错误的语法。如文档所述,您的查询将以以下方式执行:
JOIN t as t2 JOIN t as t3 --> t2 CROSS JOIN t3您使用的语法不是标准SQL,不能在任何符合SQL标准的数据库中使用。查看特定的MySQL联接文档这里。
https://stackoverflow.com/questions/31448372
复制相似问题