数据查询时几个关键字(IN、OR、EXIST)的效率分析

1、IN 和 OR 的执行效率:
a.id IN(15,150,200,300)
a.id=15 OR a.id=150 OR a.id=200 OR a.id=300

两个的执行效率基本一样,
当IN后面的条件是固定少量的值时,他会解释成OR连接,即编译后和OR连接一样;
当IN后面的条件很长时,最好使用OR连接,因为IN在解释成OR连接时有可能有解析时间的bug而使其效率变低。

2、IN 和 EXIST 的执行效率:
SELECT * FROM t1 WHERE c1 IN(SELECT c1 FROM t2 WHERE t2.c2='xx')
这个例子子查询的where条件不受外层查询的影响,这类查询将自动转为exist语句,因此效率和exist相同;

SELECT * FROM t1 WHERE c1 IN(SELECT c1 FROM t2 WHERE t2.c2='xx' AND t2.c3=t1.c2)
这个例子子查询的where条件受外层查询的影响,这类查询要看相关条件涉及的字段的索引情况和数据量的大小,数据量大的时候效率非常低,这类查询建议使用exist;

只显示t1表的数据:
SELECT * FROM t1 WHERE id IN(SELECT id FROM t2)
只显示t1表的数据,关系条件只有一个,使用IN更快;

SELECT * FROM t1 WHERE id IN(SELECT1 FROM t2 WHERE id=A.id AND c1=A.c1)
只显示t1表的数据,关系条件不只一个,使用EXIST更快SELECT * FROM t1 EXIST(SELECT 1 FROM t2 WHERE id=A.id AND c1=A.c1);

显示两个表的数据,使用IN和EXIST都不合适,建议使用JOIN:
SELECT * FROM t1 LEFT JOIN t2 ON c1=t1.c1


总结:
IN后面的条件是固定值:
少量的用IN,大量的用OR。

IN后面的条件是子查询:

当只显示t1表的数据,最好用EXIST;当两个表(t1、t2)的数据都显示,用JOIN。

(该文章在博客园也发表过,有不对的地方或者有更好的方法,请指出,分享是最好的学习。)


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值