exist优化 in mysql_MySQL IN/EXISTS优化问题

MySQL  IN/EXISTS优化问题

where条件in操作,当子查询的条件中有IN操作时效率低下,sql语句:

SELECT

a.id

FROM

A a

INNER JOIN B b ON a.id = b.id

WHERE

条件

AND a.id IN (SELECT c.id FROM C c LEFT JOIN D d ON c.id=d.id WHERE 条件)

尝试EXISTS同样效率低下,sql语句:

SELECT

a.id

FROM

A a

INNER JOIN B b ON a.id = b.id

WHERE

条件

AND EXISTS (

SELECT

c.id

FROM

C c LEFT JOIN D d ON c.id=d.id

WHERE

c.id = a.id

AND 条件

)

上面这两种方法在条件中in包含多个字符时query时间均大于20s,我看到有的这种sql跑了60s以上的

优化1:将子查询作为虚表用inner join改写

SELECT

a.id

FROM

A a

INNER JOIN B b ON a.id = b.id

INNER JOIN (

SELECT DISTINCT

c.id

FROM

C c LEFT JOIN D d

WHERE

条件

) con ON con.id = a.id

WHERE

条件

这种的query时间几乎为0s

优化2:将子查询外包一层作为虚表

SELECT

a.id

FROM

A a

INNER JOIN B b ON a.id = b.id

WHERE

条件

AND a.id IN (

SELECT

id

FROM

(

SELECT DISTINCT

c.id

FROM

C c LEFT JOIN D d

WHERE

条件

) AS temp

)

这种query时间大概在1s左右

总结:

当父表数据集大于子查询表时,EXISTS效率低于IN,反之;

mysql的IN是将括号中的常量全部保存在一个排好序数组中,匹配时为二分查找,时间复杂度O(logn);

mysql对IN包含子查询的处理很差,项目里还是要尽量避免子查询,用join处理效率很好;

可以将IN中的子查询外包装一层来优化,效率次之

本文为胖虎原创文章,转载无需和我联系,但请注明来自胖虎博客panghucat.cn

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值