mysql的in+子查询

【mysql最糟糕的子查询:in+子查询】
select * from film where film_id in (select film_id from film_actor where actor_id = 1)

一般认为:
先执行子查询,然后再执行父查询


select group_concat(film_id) from film_actor where actor_id = 1 // 返回101,103
select * from film where film_id in (101,103)

实际
mysql将相关的外层表压到子查询中
select * from film where exists (select * from film_actor where actor_id=1 and film.film_id = film_actor.film_id)
先对film全表扫描,根据返回的film_id逐个对film_actor进行子查询
如果外层表很大,则该查询很糟糕

改写:
select film.* from film inner join film_actor using(film_id) where actor_id = 1

另一个优化方法:
使用 group_concat 在 in 中构造一个由逗号分隔的列表

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值