美文网首页
Join 连表操作

Join 连表操作

作者: DH大黄 | 来源:发表于2021-09-14 23:14 被阅读0次

参考文章

https://time.geekbang.org/column/article/79700

https://time.geekbang.org/column/article/80147

NLJ(Index Nested-Loop Join)

对于被驱动表有索引的情况

遍历驱动表,每读出一条驱动表上的数据,都会去被驱动表的索引树上获取满足条件的数据,组成一行作为结果集的一部分。然后重复上述步骤

NLJ优化使用MRR的时候,就会先讲驱动表的数据部分存放到join_buffer中,然后一次性传入一批的关联数据到被驱动表中,加快查询速度

假如驱动表的数据过多,也会有分段放入join_buffer的情况(BKA算法)

BNL(Block Nested-Loop Join)

对于被驱动表没有可用索引的情况

对驱动表做遍历,将数据放入join buffer,然后对第二张表做遍历,在内存中做匹配放入join buffer中

假如驱动表太大,join buffer不够的情况,会分块获取被驱动表的数据,然后逐块去做上述的步骤(被驱动表被扫描的次数增加)

这种情况就不适合使用join去做连表查询了

原因:假设被驱动表也非常大

  1. 被驱动表全表扫描次数增多,io增加

  2. 本身比较的次数也很多

  3. 对buffer pool 影响时间比较久,使业务正常访问的数据页没有机会进入young区

对于BNL的一种优化,mysql 8.0以后的hash join(个人理解:相较于BNL,减少了比较的次数)

http://mysql.taobao.org/monthly/2019/11/02/

使用到BNL的情况(这种情况就需要优化了)

image

常说的小表驱动大表 何谓小表

应该是两个表按照各自的条件过滤,过滤完成之后,计算参与 join 的各个字段的总数据量,数据量小的那个表,就是“小表”

相关文章

  • Join 连表操作

    参考文章 https://time.geekbang.org/column/article/79700[https...

  • thinkphp 5.1的with和传统的join场景测试

    1. 传统业务查询方式 传统业务查询方式在涉及连表操作的时候一般用join连表,大约有一下缺点。 有的时候连表过多...

  • MapReduce join

    一、说明 MapReduce提供的表连接操作包括:Map端join、Reduce端join、semi join(半...

  • Hive数据库连接操作雷区

    基础操作测试 首先准备两张表收入表 hive_join_gaap_test 和 信息表 hive_join_pl_...

  • hive 查询性能优化总结

    一、join优化 ** Join查找操作的基本原则:** 应该将条目少的表/子查询放在 Join 操作符的左边。原...

  • Hadoop6- MapReduce join

    Hadoop MapReduce join MapReduce提供了表连接操作其中包括Map端join、Reduc...

  • mysql DQL语言查询总结

    语法:select 查询列表 ⑦from 表1 别名 ①连接类型 join 表2 ②on 连...

  • SQL基础二刷

    1.join 和 left join 区别 总结: join只会满足所有连表条件的符合的数据; left jion...

  • SQL 小记

    In操作符 字段设置别名 多表查询 left join 以左表为基准 LEFT JOIN 关键字从左表(Websi...

  • sqlzoo练习10-join quiz

    Join opetation指的是不同的表之间通过某个相同的字段进行关联,从而进行查询操作。本文是对Join操作的...

网友评论

      本文标题:Join 连表操作

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