• Mysql的in和exists用法区别


    一.构建模拟环境

    表A有某学校所有学生的姓名
    表B有某学校所有的班级
    要求通过班级查询所有学生的姓名

    二.比较

    1)首先用in查询姓名

    select * from A where name in (select name from B);
    
    • 1

    该命令等价于

    先走子查询 select name from B;
    再走A表 select * from A where A.name=B.name;
    
    • 1
    • 2

    它相当于一个大循环,嵌套着里面的一个小循环
    其中子查询为外部循环,主查询语句是内部的循环

    可以看出:
    内表的结果无论如何都需要遍历(外层循环),这是不可避免的。
    所以子查询A小于B,使用in性能越好。

    2)用exists查询姓名

    select * from A where exists ( select 1 from B where A.name=B.name );
    
    • 1

    该命令等价于:

    先走表A  select * from A;
    再走表B  select * from B where A.name=B.name;
    
    • 1
    • 2

    它也是一个大循环嵌套一个内循环
    不过,此处表A查询是外循环

    可以看出:
    外层表(A)的结果无论如何都需要遍历(外层循环),这是不可避免的。
    所以A数据量大于B,使用exists性能越好。

    三.结论

    当A是外层循环(必须遍历),B是内层循环
    A数据量小于B数据量,用in
    A数据量大于B数据量,用exists(此时B是外层循环)

    一句话:选择外层循环表数据量小的。

  • 相关阅读:
    ROS 服务通信理论模型
    java继承性
    你是否还迷茫要不要学习Linux?
    基于.Net5+Vue+iView前后端分离通用权限开源系统
    CNN卷积神经网络
    计算机网络(HTTPS)
    SpringBoot SpringBoot 基础篇(第一篇) 第1章 SpringBoot 入门 1.3 SpringBoot 快速入门
    从键盘上输入数字并查找某数
    C#基础--对象和类型
    html&css
  • 原文地址:https://blog.csdn.net/oldboy1999/article/details/126107637