34 | 别再说不能使用Join了(这是常识问题-上篇)

一、前言

1.1.背景

最近组内在推规范说不能使用Join,感觉有点以偏概全。更多的是合理使用Join,而不是盲目的Join。

1.2.数据准备

假设t1表结构为【id,a(索引),b】数据有100条,t2表结构有1000条数据。

二、正文

2.1.MySQL对于Join的算法有哪几类?

  • Index Nested-Loop Join.

  • Blocked Nested-Loop Join.

2.2.什么是驱动表?什么是被驱动表?如何选择驱动表、被驱动表?怎么让优化器按照指定的驱动表和被驱动表来运行?

  • select * from 驱动表

  • 被join的表一般是被驱动表

  • 驱动表尽量过滤筛选后数据量小,被驱动表一定要使用得上索引

  • straight_join 让 MySQL 使用固定的连接方式执行查询,这样优化器只会按照我们指定的方式去 join

2.3.举一个可以用上NLJ的例子?Index Nested-Loop Join内部执行流程是什么?

  • select * from t1 straight_join t2 on (t1.a=t2.a)

  • 1)对驱动表 t1 做了全表扫描,这个过程需要扫描 100 行,但不是一次性全部加载到内存中;2)对于每一行 R,根据 a 字段去表 t2 查找,走的是非主键索引搜索过程,再根据非主键索引定位到主键索引的一行记录,跟 R 组成一行,作为结果集的一部分 

2.4.举一个可以用上BLJ的例子?什么情况下可能会用到BLJ?Block Nested-Loop Join内部执行流程是什么?join_buffer_size默认值是多少?如果join_buffer大小不足怎么办?join_buffer_size越大对Innodb引擎的的影响是什么?

  • select * from t1 straight_join t2 on (t1.a=t2.b)

  • 被驱动表不能用索引情况下会用到BLJ算法

  • 1)将驱动表中的数据要查询的内容加载到join_buffer中。2)扫描表 t2,把表 t2 中的每一行取出来,跟 join_buffer 中的数据做对比,满足 join 条件的,作为结果集的一部分返回。

  • join_buffer_size 默认值是 256k

  • 分批加载

  • 扫描次数减少

PS:本次没有牛逼评论~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值