zoukankan      html  css  js  c++  java
  • (转)MySQL中In与Exists的区别

    背景:总结mysql相关的知识点。

    如果A表有n条记录,那么exists查询就是将这n条记录逐条取出,然后判断n遍exists条件。

    select * from user where exists select * from user);
    #等价于
    select * from user where exists (select 1);

    in查询就是先将子查询条件的记录全都查出来,假设结果集为B,共有m条记录,然后再将子查询条件的结果集分解成m个,再进行m次查询。

    select * from user where user_id in (1, 2, 3);
    #等效于
    select * from user where user_id = 1 or user_id = 2 or user_id = 3;

    因为索引,in主要用到了外表的索引,exist用的是子查询的索引

    5.5以后的MySQL版本在exists匹配查询结果时使用的是Block Nested-Loop(Block嵌套循环,引入join buffer,类似于缓存功能)开始对查询效率产生显著影响,尤其针对<font color=red>子查询结果集很大</font>的情况下能显著改善查询匹配效率:

    通过以上分析,很容易得出下面的结论:

    • IN查询在内部表和外部表上都可以使用到索引;
    • Exists查询仅在内部表上可以使用到索引;
    • 子查询结果集很大,而外部表较小的时候,Exists的Block Nested Loop(Block 嵌套循环)的作用开始显现,并弥补外部表无法用到索引的缺陷,查询效率会优于IN。
    • 子查询结果集较小,而外部表很大的时候,Exists的Block嵌套循环优化效果不明显,IN 的外表索引优势占主要作用,此时IN的查询效率会优于Exists。
    • 网上的说法不准确,即表的规模不是看内部表和外部表,而是外部表和子查询结果集。
    • 最后一点,也是最重要的一点:世间没有绝对的真理,掌握事物的本质,针对不同的场景进行实践验证才是最可靠有效的方法。

    MySQL(七)|MySQL中In与Exists的区别(1)

    MySQL(八)|MySQL中In与Exists的区别(2)

  • 相关阅读:
    分享Kali Linux 2016.2第41周镜像虚拟机
    Visual Studio工具栏中无法选择调试设备
    Xamarin.iOS编译出错
    Xamarin基础命名空间Microsoft.SqlServer.Server
    编译包含Google Play服务App的SDK版本问题
    解决Fiddler无法抓到手机的会话包
    Xamarin.Android编译CPU类型选择方式
    Delphi iOS
    Delphi Android
    CRC16-循环冗余校验
  • 原文地址:https://www.cnblogs.com/lixuwu/p/10674714.html
Copyright © 2011-2022 走看看