IN与OR与EXISTS

北慕城南 提交于 2019-11-29 10:24:06

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;

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!