我正在编写一个脚本,该脚本基于使用多个表连接在一起的查询生成报告。脚本的输入之一将是报告中所需字段的列表。根据请求的字段,可能不需要某些表。我的问题是:如果在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应该知道完全忽略连接,因为表在SELECT或WHERE子句中没有被引用。但不知何故,我对此表示怀疑。当然,这是一个非常基本的例子。实际涉及的数据将会复杂得多。
真的,这不是一个很大的交易。我只需要知道我的脚本是否需要对连接进行“智能”处理,并且只有在请求的字段将依赖于它们时才包含它们。
发布于 2011-05-03 00:56:23
这实际上并不是未使用的,因为它意味着只有Books中存在的作者才会包含在结果集中。
JOIN
`Books`
ON `Authors`.`id` = `Books`.`authorId`但是,如果您“知道”Book中存在每个作者,那么删除连接将会有一些性能上的好处,但这在很大程度上取决于索引、表中的记录数以及连接中的逻辑(尤其是在进行数据转换时)
发布于 2011-05-03 01:26:35
这是一种无法回答的问题。是的,添加连接将需要额外的时间;如果没有uh....measuring时间,就不可能知道是否能够测量该时间。
一般而言,如果像您的示例中那样,使用唯一索引连接主键,则不太可能产生可测量的差异。
如果您有更复杂的连接(这是您所暗示的),或者是在没有索引的字段上连接,或者如果您的连接涉及一个函数,那么性能损失可能会很大。
当然,除了删除不需要的连接之外,以这种方式编写多个本质上相同的查询可能仍然更容易。
最后一点建议-尝试将查询抽象为视图。这样,您就可以一次优化性能,也许还可以用一种更简单的方式编写报表查询...
发布于 2011-05-03 01:16:22
连接总是要花时间的。
副作用
最重要的是,inner join (这是默认的连接)通过限制获得的行数来影响结果。因此,取决于是否所有authors都在books中,这两个查询可能相同,也可能不相同。
此外,如果author编写了多个book,则“joined”查询的结果集将显示重复的结果。
Performance
在WHERE子句中,您已经将authors.id声明为一个常量=1,因此(假设您在author.id和books.author_id__上有索引)对于这两个表,这将是一个非常快速的查找。两个表之间的查询时间将非常接近。
一般来说,连接可能会花费相当多的时间,而且所有附加的副作用应该只在你真的想要使用连接提供的额外信息时才会进行。
https://stackoverflow.com/questions/5859920
复制相似问题