一、前言
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:本次没有牛逼评论~