mysql join的原理及过程
连接过程
每获得一条驱动表记录,就立即到被驱动表寻找匹配的记录。
对于两表连接来说,驱动表只会被访问一遍,但被驱动表却要被访问好多遍;具体访问几遍取决于对驱动表执行单表查询后的结果集中有多少条记录。
对于内连接来说,选取哪个表为驱动表都没关系。
而外连接的驱动表是固定的,也就是说左(外)连接的驱动表就是左边的那个表,右(外)连接的驱动表就是右边的那个表。
连接原理
嵌套循环连接
连接步骤:
步骤1 :选取驱动表,使用与驱动表相关的过滤条件,选取代价最低的单表访问方法来执行对驱动表的单表查询.
步骤2:对步骤 1中查询驱动表得到的结果集中的每一条记录,都分别到被驱动表中查找匹配的记录(先通过“涉及两表的过滤条件”匹配,再进行“只涉及被驱动表的过滤条件”进行过滤)。
由于被驱动表可能会访问多次,因此可以为被驱动表建立合适的索引以加快查询速度。
如果驱动表非常大,则可能会多次访问被驱动表,就会导致很多次的磁盘I/O,此时可以使用基于块的嵌套循环连接算法来缓解由此造成的性能损耗。
优化:基于块的嵌套循环连续
join Buffer (连接缓冲区〉
Join Buffer 就是在执行连接查询前申请的一块固定大小的内存。先把若干条驱动表结果集中的记录装在这个 Join Buffer 中,然后开始扫描被驱动表,每条被驱动表的记录一次性地与 Join Buffer 中的多条驱动表记录进行匹配。由于匹配的过程都是在内存中完成的,所以这样可以显著减少被驱动表的I/O代价.
最好的情况是 Join Buffer 够大 能容纳驱动表结果集中的所有记录,这样只需要访问一次被驱动表就可以完成连接操作了。
由join buffe _size配置。