假设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没有被使用,只会忽略它。但它没有?
答案 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。