未使用联接的性能惩罚

Tho*_*ley 7 mysql performance join

我正在编写一个脚本,该脚本基于使用连接在一起的多个表的查询生成报告.脚本的其中一个输入将是报告所需的字段列表.根据请求的字段,可能不需要某些表.我的问题是:如果在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 |
+----+----------+-----------+
Run Code Online (Sandbox Code Playgroud)

是否

SELECT
    `Authors`.`lastName`
FROM
    `Authors`
WHERE
    `Authors`.`id` = 1
Run Code Online (Sandbox Code Playgroud)

增持:

SELECT
    `Authors`.`lastName`
FROM
    `Authors`
JOIN
    `Books`
    ON `Authors`.`id` = `Books`.`authorId`
WHERE
    `Authors`.`id` = 1
Run Code Online (Sandbox Code Playgroud)

在我看来,MySQL应该知道完全忽略JOIN,因为SELECT或WHERE子句中没有引用该表.但不知何故,我怀疑是这种情况.当然,这是一个非常基本的例子.涉及的实际数据将更加复杂.

实际上,这不是一个非常大的交易...我只需要知道我的脚本是否需要对连接"智能",并且只有在请求的字段依赖它们时才包含它们.

Con*_*rix 3

这实际上并没有被使用,因为它意味着只有图书中存在的作者才会包含在结果集中。

JOIN
    `Books`
    ON `Authors`.`id` = `Books`.`authorId`
Run Code Online (Sandbox Code Playgroud)

但是,如果您“知道”每个作者都存在于 Book 中,那么删除联接会带来一些性能优势,但这在很大程度上取决于索引、表中的记录数以及联接中的逻辑(尤其是在进行数据转换时) )