您好,欢迎访问一九零五行业门户网

MySQL In不能用内连接改写

原来面试的时候,是作为面试题背的..什么mysql in 使用exists方式,很慢...面试官问怎么办..回答用内连接改写..然后面试官露出满意
原来面试的时候,,是作为面试题背的..
什么mysql in 使用exists方式,很慢...
面试官问怎么办..回答用内连接改写..
然后面试官露出满意笑容..
一直以来都是这个剧本..
直到昨天我才发现..这个剧本原来是错的.
实验数据
create table song(
 songid int
 );
 insert into song values(1),(2),(3);
 create table song_category_relation(
 category varchar(10),
 songid int
 );
 insert into song_category_relation values
 ('华语',1),
 ('华语',2),
 ('华语',3),
 ('热门',3);
 song是歌曲表
song_category_relation是歌曲和分类的映射关系表.
一个歌曲可能有多个分类.
需求.
已知一个歌曲的id,找到这个歌曲所属的所有分类,然后再找到所有分类下的所有歌曲.
使用in
 select * from song where songid in (
 select songid from song_category_relation where category in
 (select category from song_category_relation where songid=3)
 );
但是此时如果用内连接改写..
select * from song inner join  (
 select songid from song_category_relation where category in
 (select category from song_category_relation where songid=3)
 ) a on (a.songid=song.songid);
可以看到,两种方式的结果并不相同..
从逻辑上看,in后面的子查询经过了去重.
原来是通过exists实现的.mysql 5.6之后,采用了semi join优化.
半连接(semi join) 参考:
本文永久更新链接地址:
其它类似信息

推荐信息