美文网首页
Mysql高级(七) 小表驱动大表

Mysql高级(七) 小表驱动大表

作者: 卡戎li | 来源:发表于2020-05-04 18:31 被阅读0次

    一、小表驱动大表的含义

    类似循环嵌套
    for(int i=5;.......)
    {
    for(int j=1000;......)
    {}
    }

    如果小的循环在外层,对于数据库连接来说就只连接5次,进行5000次操作,如果1000在外,则需要进行1000次数据库连接,从而浪费资源,增加消耗。这就是为什么要小表驱动大表。

    二、in 和exists 性能对比

    • 当B表的数据集小于A表数据集时,用in优于exists。

    select *from tb_emp_bigdata A where A.deptno in (select B.deptno from tb_dept_bigdata B)

    • 当A表的数据集小于B表的数据集时,用exists优于in。

    select *from tb_dept_bigdata A where A.deptno in(select B.deptno from tb_emp_bigdata B);

    图片.png
    • 原理
    select * from A where id in (select id from B)
    等价于
    for select id from B
    for select * from A where A.id = B.id
    

    当B表的数据集必须小于A表的数据集时,用in 优于exists.

    select * from A where exists  (select 1 from B where B.id = A.id)
    等价于
    for select * from A
    for select * from B where A.id = B.id
    

    当B表的数据集必须大于A表的数据集时,用exists优于in.

    三、总结

    in后面跟的是小表,exists后面跟的是大表。
    简记:in小,exists大。

    对于exists

    select .....from table where exists(subquery);

    可以理解为:将主查询的数据放入子查询中做条件验证,根据验证结果(true或false)来决定主查询的数据是否得以保留。

    参考博客:https://www.cnblogs.com/developer_chan/p/9247185.html

    相关文章

      网友评论

          本文标题:Mysql高级(七) 小表驱动大表

          本文链接:https://www.haomeiwen.com/subject/elvyghtx.html