• (转)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)

  • 相关阅读:
    Python 函数 I
    jmeter-将上一个接口的返回值作为下一个接口的参数
    Python 文件的操作
    Python 基础数据类型 VI
    Pyhton 基础数据类型 V (补充)
    Python 基础数据类型 IV (集合)
    Python 基础数据类型 III (字典)
    难道是你?
    是你啦
    checkWeb
  • 原文地址:https://www.cnblogs.com/lixuwu/p/10674714.html
Copyright © 2020-2023  润新知