mysql优化:exists、 in、not exists、not in

àì夳堔傛蜴生んèń 2023-10-04 10:55 31阅读 0赞

1、exists与in,not exists与not in的区

  1. -- in
  2. SELECT
  3. A.*
  4. FROM
  5. A
  6. WHERE
  7. A.id
  8. IN
  9. (SELECT B.id FROM B WHERE B.id = A.id)
  10. -- exists
  11. SELECT
  12. A.*
  13. FROM
  14. A
  15. WHERE
  16. exists
  17. (SELECT B.id FROM B WHERE B.id = A.id)

in 与 exists 区别

当A表数据大于B表数据时,选择in比exists执行效率要高。

相反,A表数据小于B表数据时,选择exists比较高效

IN会走索引,但是当IN的取值范围较大时会导致索引失效,走全表扫描。

  • IN : 对于 in 查询来说,会先执行子查询,如上边的 t2 表,然后把查询得到的结果和外表 t1做笛卡尔积,再通过条件进行筛选(这里的条件就是指name是否相等),把每个符合条件的数据都加入到结果集中。

sql 如下,

  1. select * from t1 where name in (select name from t2);

伪代码如下:

  1. for(x in A){
  2. for(y in B){
  3. if(condition is true) {result.add();}
  4. }
  5. }

这里的 condition 其实就是对比两张表中的 name 是否相同。

  • EXISTS : 对于 exists 来说,是先查询遍历外表 t1 ,然后每次遍历时,再检查在内表是否符合匹配条件,即检查是否存在 name 相等的数据。

sql 如下,

  1. select * from t1 where name exists (select 1 from t2);

伪代码如下:

  1. for(x in A){
  2. if(exists condition is true){result.add();}
  3. }

对应于此例,就是从 id 为 1001 开始遍历 t1 表 ,然后遍历时检查 t2 中是否有相等的 name 。

如 id=1001时,张三存在于 t2 表中,则返回 true,把 t1 中张三的这条记录加入到结果集,继续下次循环。 id=1002 时,李四不在 t2 表中,则返回 false,不做任何操作,继续下次循环。直到遍历完整个 t1 表。

②not exists 与not in 区别

not in 会使索引失效,无论在哪种情况not exists 都比 not in 高效

发表评论

表情:
评论列表 (有 0 条评论,31人围观)

还没有评论,来说两句吧...

相关阅读