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(SELECT 1 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。
转载于:https://www.cnblogs.com/augustine/archive/2013/01/22/2871032.html