数据库原理之二join原理

简介

本节属于索引方面的内容,这里做个简单的介绍。
原文

双层for循环

Simple Nested-Loop Join,当执行select * from user tb1 left join level tb2 on tb1.id=tb2.user_id,简单实现就是两个for循环嵌套,去对比

for (user表记录 ur: user表){
	for (level表记录 lr: level表){
		if(ur.id == lr.user_id){
			// 返回成功数据
		}
	}
}

过程如下:

索引-1

这种算法的复杂度是o(n²),性能显然弱了,稍一加工,就有下边这种方式。

索引嵌套

Index Nested-Loop Join。上例中的查询,如果在level表中的user_id有建索引,那么就可以通过外层表匹配条件 直接与内层表索引进行匹配,匹配次数=外层表的行数 * 内层表索引的高度。一般B+树的高度在3层上,算法复杂度就是o(3n)了。

索引

缓存循环

.Block Nested-Loop Join,如果在在内层表上没有索引,有没有方法加快速度?就有了这种方法,优化思路是减少内层表的扫表次数。这种方法是没有索引情况下的默认方法。

缓存块嵌套循环连接算法意在通过一次性缓存外层表的多条数据,以此来减少内层表的扫表次数,从而达到提升性能的目的。

缓存块

默认情况下join_buffer_size=256K,在查找的时候MySQL会将所有的需要的列缓存到join buffer当中,包括select的列,而不是仅仅只缓存关联列。在一个有N个JOIN关联的SQL当中会在执行时候分配N-1个join buffer。

# MySQL 

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×