mysql中not in和not exists两种查询到底哪种快

之前看到了一篇文章,前提条件是表A的数据量比表B的数据量大,有以下比较:一、in和exists的效率比较当大数据量的表A做主表查询,小数据量的表B做子查询时,用in的效率... 之前看到了一篇文章,前提条件是表A的数据量比表B的数据量大,有以下比较:
一、in和exists的效率比较
当大数据量的表A做主表查询,小数据量的表B做子查询时,用in的效率比较高,exists的效率比较低;反正则exists的效率比较高,in的效率比较低,如下:
select * from A where id in(select cid from B );//快
select * from A where exists(select cid from B where A.id=B.cid);//慢

select * from B where cid in(select id from A );//慢
select * from B where exists(select id from A where A.id=B.cid);//快

二、not in和not exists的效率比较
不管哪个表做主查询,哪个表做子查询,not exists的效率都会比not in的效率高

今天我对这两种比较做了实验,发现第一个比较确实是如这篇文章说的那样,可是第二中比较却不是这样的,我发现,not in和not exists的效率比较也如in和exists的效率比较一样,大表做主表查询时not in的效率会比较高,小表做主表查询时not exists的效率会比较高,这样就把我给搞蒙了,到底not in和not exists的效率比较,哪种才是正确的呢
展开
 我来答
tjrmgs
2016-10-18 · TA获得超过5765个赞
知道大有可为答主
回答量:2161
采纳率:94%
帮助的人:1033万
展开全部
in和exists不论是大数据表还是小数据表,有可利用的索引还是无可利用的索引的情况下,它们的运行效率是差不多的,exists也许会稍微高一点点,但是差别很小。

not exists在有可被利用索引的情况下效率很高,但是在大数据表的情况下如果没有可被利用索引的情况下其运行效率很差。

not in 则在大数据表的情况下,不论有无可被利用的索引,其运行效率均极低,比无索引可用的not exists还要慢很多。

in和exists常用于求交集,它们的运行效率分别不大,可根据个人喜好选用。not in和not exists常用于求非交集,小数据表时可随便用,但是碰到大数据表时就要小心了。not in不论有无可被利用的索引都会出现效率上的悲剧,应避免使用。not exists在有索引可用的情况下表现优异可作为获取非交集的首选,然而在无索引可用时却很慢,此时也应避免使用。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式