• MYSQL中in的用法


    工作原理

       以如下SQL为例,分析in在嵌套查询语句中的工作原理:
    SELECT * FROM A WHERE id IN (SELECT id FROM B);)
       等价于:
    • SELECT id FROM B ----->先执行in中的查询,并且缓存结果集;
    • SELECT * FROM A WHERE A.id = B.id。
       工作原理:缓存B中查询出来的id,A表查询时把A表的id与缓存数据比较,满足条件的数据加入结果集。
       以上SQL语句中,in中的子查询语句仅仅执行一次,它查询出B中的所有的id并缓存起来,然后检查A表中的id在缓存中是否存在,如果存在则将A的当前记录加入到结果集中,直到遍历完A表中所有记录为止。
     

    适用场景

      从内外表数据量的大小视角剖析,B表数据比A表数据小,B表符合要求的数据都被缓存起来,A中每查询一次就与缓存中的数据比较一次。以下用遍历结果集的方式来分析IN查询:
       private void search() {
           List result = new ArrayList(); //结果集
            String A[] = {"select * from A"}; // 存储从A表查询到的结果集
            String B[] = {"select * from B"}; // 存储从B表查询到的结果集
            for (String bValue : B) {
                for (String aValue : A) {
                    if (aValue.equals(bValue)) {
                        result.add(aValue);
                        break;
                    }
                }
            }
            System.out.println(result);
        }

       通过以上Java伪代码可以看出,当B表的数据较大时不适合使用in查询,因为它会遍历B表中的全部记录。

    案例分析

       1、A表中有100条记录,B表中有1000条记录,那么最多可能遍历1000*100次,效率很差;
       2、A表中有1000条记录,B表中有100条记录,那么最多可遍历100*1000此,内循环次数减少,效率大大提升。

    小结

       IN查询适合B表数据量比A表数据量小的情况,并且是从缓存中取数据。
  • 相关阅读:
    【知识强化】第六章 查找 6.4 散列(Hash)表
    【知识强化】第七章 排序 7.5 归并排序和基数排序
    【知识强化】第六章 查找 6.3 B树和B+树
    【知识强化】第五章 图 5.4 图的应用
    【知识强化】第五章 图 5.3 图的遍历
    linux的自启动服务脚本的(/etc/rc.d/init.d或者其链接/etc/init.d)
    shell文件包含
    shell输入输出重定向
    shell函数参数
    shell函数
  • 原文地址:https://www.cnblogs.com/east7/p/13097935.html
Copyright © 2020-2023  润新知