mysql in existnull,EXISTS与IN的子查询-MySQL

以下两个查询是子查询。两者相同,都对我有效。但是问题是方法1的查询大约需要10秒才能执行,而方法2的查询不到1秒。

我能够将方法1的查询转换为方法2,但是我不了解查询中正在发生什么。我一直想自己弄清楚。我真的很想了解以下两个查询之间的区别是什么,以及如何获得性能提升?它背后的逻辑是什么?

我是这些高级技术的新手。我希望有人能在这里帮助我。考虑到我阅读的文档并没有给我任何提示。

方法1:

SELECT

*

FROM

tracker

WHERE

reservation_id IN (

SELECT

reservation_id

FROM

tracker

GROUP BY

reservation_id

HAVING

(

method = 1

AND type = 0

AND Count(*) > 1

)

OR (

method = 1

AND type = 1

AND Count(*) > 1

)

OR (

method = 2

AND type = 2

AND Count(*) > 0

)

OR (

method = 3

AND type = 0

AND Count(*) > 0

)

OR (

method = 3

AND type = 1

AND Count(*) > 1

)

OR (

method = 3

AND type = 3

AND Count(*) > 0

)

)

方法2:

SELECT

*

FROM

`tracker` t

WHERE

EXISTS (

SELECT

reservation_id

FROM

`tracker` t3

WHERE

t3.reservation_id = t.reservation_id

GROUP BY

reservation_id

HAVING

(

METHOD = 1

AND TYPE = 0

AND COUNT(*) > 1

)

OR

(

METHOD = 1

AND TYPE = 1

AND COUNT(*) > 1

)

OR

(

METHOD = 2

AND TYPE = 2

AND COUNT(*) > 0

)

OR

(

METHOD = 3

AND TYPE = 0

AND COUNT(*) > 0

)

OR

(

METHOD = 3

AND TYPE = 1

AND COUNT(*) > 1

)

OR

(

METHOD = 3

AND TYPE = 3

AND COUNT(*) > 0

)

)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值