mysql的join原理
mysql的join原理
Nested-Loop Join 算法,需要区分驱动表和被驱动表,先访问驱动表,筛选出结果集,然后将这个结果集作为循环的基础,访问被驱动表过滤出需要的数据。
算法这两种表分为驱动表和被驱动表,使用嵌套循环。驱动表在外循环,被驱动表在内循环。
- SNLJ,Simple Nested-Loop Join,简单嵌套循环。
- NLJ,Index Nested-Loop Join,索引嵌套循环。如果 join 的字段有索引
- BNLJ,Block Nested-Loop Join,块嵌套循环。如果 join 的字段没有索引,加入了 buffer 缓冲区,降低了内循环的个数,也就是被驱动表的扫描次数。这个 buffer 被称为 join buffer
为什么join要小表驱动大表
类似循环嵌套
for(int i=5;.......)
{
for(int j=1000;......)
{}
}
- 如果小的循环在外层,对于数据库连接来说就只连接5次,进行5000次操作,如果1000在外,则需要进行1000次数据库连接,从而浪费资源,增加消耗。这就是为什么要小表驱动大表。