mysql - 未使用连接的性能惩罚

标签 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 |
+----+----------+-----------+

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 子句中没有引用该表。但不知何故,我怀疑情况是否如此。当然,这是一个非常基本的例子。实际涉及的数据会复杂得多。

实际上,这并不是什么大不了的事...我只需要知道我的脚本是否需要“智能”连接,并且仅在请求的字段依赖于它们时才包括它们。

最佳答案

这实际上并不是未使用的,因为它意味着结果集中只包含 Books 中存在的作者。

JOIN
    `Books`
    ON `Authors`.`id` = `Books`.`authorId`

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

关于mysql - 未使用连接的性能惩罚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5859920/

相关文章:

javascript - MySql SELECT 多个根据表单输入并发布

c++ - openmp嵌套循环处理性能

linux - 运行 `perf stat` 时 `time` (和 `perf trace -s`!)是否显示不正确的结果?

java - Hibernate连接表

mysql - 连接表 - 有点复杂

php - 我的更新查询有什么问题?

mysql - 使用 If 或 Case(或任何其他方法)根据国家/地区代码递增值

mysql - 在 SQL Like 表达式中使用较长的字符串是否会阻碍或帮助查询执行速度?

c++ - BOOST uBLAS 矩阵乘积极慢

mysql - 如何为订单及其项目编写自定义 MySQL 选择查询