exits 代替in_mysql IN 可否使用 EXISTS 替代,求提示

一开始的语句是这样的

SELECT

a.*, b. NAME AS store_name

FROM

order a

LEFT JOIN store b ON a.store_id = b.id

WHERE

a.wid IN (

100020109, 100020114, 100020112, 100020133, 100020131, 100020143, 100020145, 100020145, 100020147, 100020149, 100020155, 100020170, ...... ,100020407

)

AND a.channel = 1

AND a.created_at >= '2019-03-01'

AND a.created_at < '2019-03-02'

AND a.is_pay = 1

AND a.type IN (2, 3)

ORDER BY

a.id DESC

解释后是这样的

6b36ebce789b46dd436db201f23f965e.png

SELECT

a.*, b. NAME AS store_name

FROM

order a

LEFT JOIN store b ON a.store_id = b.id

WHERE

EXISTS (

SELECT

c.wid

FROM

`tree` c

WHERE

c.deleted_at IS NULL

AND c.first_agent_id = 207

AND a.wid = c.wid

)

AND a.channel = 1

AND a.created_at >= '2019-03-01'

AND a.created_at < '2019-03-02'

AND a.is_pay = 1

AND a.type IN (2, 3)

ORDER BY

a.id DESC

LIMIT 0,

20

a4aa7130f16f40df0efe887cb696090e.png

并没有一点效果!!!

以下来自网络:

一直以来认为exists比in效率高的说法是不准确的。

如果查询的两个表大小相当,那么用in和exists差别不大。

如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in:

例如:表A(小表),表B(大表)

1:

select * from A where cc in (select cc from B)

效率低,用到了A表上cc列的索引;

select * from A where exists(select cc from B where cc=A.cc)

效率高,用到了B表上cc列的索引。

相反的

2:

select * from B where cc in (select cc from A)

效率高,用到了B表上cc列的索引;

select * from B where exists(select cc from A where cc=B.cc)

效率低,用到了A表上cc列的索引。

https://blog.csdn.net/shooke/article/details/52605232

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值