MySQL&表现:使用'IN'或'JOIN'?

时间:2012-08-29 07:34:14

标签: mysql performance

我有一些代码,它们通过ID查找数据库中的几张CD。这是使用'IN'条件完成的:

(1) SELECT * FROM album WHERE id IN (?,?,?,?,?)

下一步是获取与这些相册相关的曲目。我通过稍微修改“基本”查询来做到这一点。

(2) SELECT track.* FROM album 
LEFT JOIN track ON track.album_id = album.id 
WHERE album.id IN(?,?,?,?,?)

现在,我有专辑和曲目。但是,我需要为曲目加载作曲家细节。由于几个原因,我无法与上述查询一起执行,因此我需要单独执行此操作。

我能做的就是根据我所获得的曲目查找作曲家,在那里我会使用曲目ID并根据这些曲目ID在作曲家表中查找作曲家。或者,我可以进一步修改“基本”查询,并再与作曲家表连接。然而;这里有一个通用规则(关于性能),它很容易指出其中一个查询是有利的吗?我已经进行了一些测试,但是我已经完成了这么小的规模,我真的看不出任何差别......

(3) SELECT composer.* FROM album 
LEFT JOIN track ON track.album_id = album.id
LEFT JOIN composer ON composer.track_id = track.id
WHERE album.id IN (?,?,?,?,?)

...或...

[get track ids from query (2)]

(4) SELECT composer.* FROM composer
WHERE composer.track_id IN (?,...);

记录:我已经在所有条件和连接列上都有索引。

1 个答案:

答案 0 :(得分:5)

没有理由在查询3中使用LEFT JOIN(很高兴为你编号),因为你只关心作曲家。 (通常外连接速度较慢。)

您无需加入查询3中的相册表 - 只需使用IN上的track.album_id即可。 (我假设你并不担心丢失专辑的流氓曲目。)

你提到你有各种各样的索引。但请记住,MySQL每个查询只能为每个表使用一个索引。因此,如果要检查多项内容,则必须制作综合索引。

令人惊讶的是,连接通常比大型IN语句更快,这是因为IN中的值未被索引,因此MySQL无法对它们进行索引连接。但这仅适用于许多值 - 对于使用IN的少数值,可能会更快。

就个人而言,我会使用JOIN方法,直到您看到此查询成为问题为止。 (只有在你需要检查一些非常复杂的条件时才会发生这种情况,这可能会慢一些)。连接是更简单的代码,并且最有可能超快 - 所以如果没有特定的原因,不要让事情变得更复杂。