IN与OR与EXISTS
使用IN的子查询:
SELECT * FROM t1 WHERE x IN (SELECT y FROM t2); -- 等价于 SELECT * FROM t1, (SELECT DISTINCT y FROM t2) t WHERE t1.x= t.y;
可见,先t2表进行了全表的扫描并唯一排序,再根据t2的y列的值去索引匹配x列的值;
使用EXISTS的子查询:
SELECT * FROM t1 WHERE EXISTS (SELECT 1 FROM t2 WHERE y = t1.x); -- 等价于 FOR tab1 IN (SELECT x FROM t1) LOOP IF(EXISTS SELECT y FROM t2 WHERE y = tab1.x) THEN OUTPUT THE RECORD; END IF; END LOOP;
可见,先t1表全表检索,再通过索引
IN 和OR 的效率,在有索引的情况下,没有区别;没有索引时,IN 的效率要高于OR;OR的效率为O(n),而IN的效率为O(log n)
子查询,小表驱动大表,内层表小用IN,表大用EXISTS;NOT EXISTS 无论什么情况都要大于NOT IN;