首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MySQL:加入一个未使用的表会增加执行时间吗?

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

Stack Overflow用户
提问于 2015-07-16 07:52:44
回答 3查看 365关注 0票数 0

假设t是一个大表,下面两个查询

代码语言:javascript
运行
复制
SELECT t1.value, t2.value 
FROM t as t1 JOIN t as t2
ON t1.id = t2.id 
WHERE t1.key = '123'

代码语言:javascript
运行
复制
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会发现第三个联接没有被使用,因此会忽略它。但事实并非如此?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-07-16 08:11:36

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

代码语言:javascript
运行
复制
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中的每个记录中。也许这就是你的意思:

代码语言:javascript
运行
复制
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进行完全连接:

代码语言:javascript
运行
复制
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

票数 1
EN

Stack Overflow用户

发布于 2015-07-16 07:58:23

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

此堆栈溢出问题包含更详细的信息。

票数 1
EN

Stack Overflow用户

发布于 2015-07-16 08:37:24

这并不是因为MySQL优化器不够聪明,无法删除未使用的查询,而是因为您在这里使用了错误的语法。如文档所述,您的查询将以以下方式执行:

代码语言:javascript
运行
复制
JOIN t as t2 JOIN t as t3 --> t2 CROSS JOIN t3

您使用的语法不是标准SQL,不能在任何符合SQL标准的数据库中使用。查看特定的MySQL联接文档这里

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31448372

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档