mysql的join+in,MySQL和性能:使用’IN’或’JOIN’?

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

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

下一步是获取与这些相册相关的曲目.我这样做是通过稍微修改’base’查询.

(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 (?,...);

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

解决方法:

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

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

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

令人惊讶的是,连接通常比大型IN语句更快,这是因为IN中的值没有被索引,因此MySQL无法对它们进行索引连接.但这只适用于很多值 – 对于少数使用IN的人来说可能更快.

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

标签:performance,mysql

来源: https://codeday.me/bug/20190901/1786198.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值