【发布时间】:2011-08-17 03:00:00
【问题描述】:
我正在编写一个脚本,该脚本基于使用多个连接在一起的表的查询生成报告。脚本的输入之一将是报告所需字段的列表。根据请求的字段,可能不需要某些表。我的问题是:如果在 SELECT 或 WHERE 子句中未引用连接,是否包含一个 [显着] 性能损失?
考虑下表:
mysql> SELECT * FROM `Books`;
+----------------------+----------+
| title | authorId |
+----------------------+----------+
| Animal Farm | 3 |
| Brave New World | 2 |
| Fahrenheit 451 | 1 |
| Nineteen Eighty-Four | 3 |
+----------------------+----------+
mysql> SELECT * FROM `Authors`;
+----+----------+-----------+
| id | lastName | firstName |
+----+----------+-----------+
| 1 | Bradbury | Ray |
| 2 | Huxley | Aldous |
| 3 | Orwell | George |
+----+----------+-----------+
会
SELECT
`Authors`.`lastName`
FROM
`Authors`
WHERE
`Authors`.`id` = 1
跑赢大盘:
SELECT
`Authors`.`lastName`
FROM
`Authors`
JOIN
`Books`
ON `Authors`.`id` = `Books`.`authorId`
WHERE
`Authors`.`id` = 1
?
在我看来,MySQL 应该只知道完全忽略 JOIN,因为 SELECT 或 WHERE 子句中没有引用该表。但不知何故,我怀疑情况是否如此。当然,这是一个非常基本的例子。所涉及的实际数据会复杂得多。
实际上,这并不是什么大不了的事情......我只需要知道我的脚本是否需要对连接“智能”,并且只有在请求的字段依赖它们时才包含它们。
【问题讨论】:
-
您列出的案例确实可以返回不同的结果。当您加入表格时,返回的结果将不是所有作者,而是所有写过书的作者。
-
哦,好点...如果它是左连接怎么办?然后它完全没有必要并返回相同的结果。在这种情况下,我想知道省略联接是否会带来性能优势?
-
哦,但是即使使用左连接,也有可能出现重复(在这种情况下,如果 WHERE 子句是:
Authors.id= 3)。所以 MySQL 总是需要首先查看该表中的内容......所以它总是会至少有一点性能下降。知道了。谢谢! -
select 子句中未使用的
LEFT JOIN和DISTINCT会不会有性能差异?
标签: mysql performance join