慎用mysql中的exists

前两天同事找到我问了一个数据库查询慢的问题,我看了他的Sql语句如下:

select a.* from a where 1=1
and exists 
(select b.w_id from b where a.id = b.w_id
			and b.c_id in ('111')
)

A表数据1W多条,B表数据2000多条,但是整个查询语句却耗时14秒多,可能很多小伙伴不清楚这个exists和in的差别,大多数情况下如果B表数据不多的话,这个语句的执行效率是没什么问题,但是如果B表数据变多,那么整个效率会导致指数级的增加,exists返回的是true或者false,它必然需要进行A*B词的判断,按目前写法需要进行2000W次的比较才能得出结果。

我将这个Sql语句改成:

select a.* from a  where 1=1
and id in 
(select b.w_id from b t2 where t2.c_id in ('111')
)

这样整个语句执行时间就降低到了0.15秒,整个效率差了将近百倍,所以我建议小伙伴在写Sql语句的时候尽量不"耍帅",还是效率优先,如果无法估算B表数量情况下,还是老实用in的吧。

展开阅读全文

页面更新:2024-04-14

标签:写法   语句   差别   没什么   同事   效率   数量   指数   建议   数据库   数据   科技

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top