此文章主要向大家描述的是MySQL数据库中的join的实际应用,我们大家都知道MySQL数据库的join只有一种,及nested loop。对于在被连接的数据子集处于较小的情况下,nested loop连接是个较好的选择。
nested loop就是扫描一个表,每读到一条记录,就根据索引去另一个表里面查找,没有索引一般就不会是 nested loops。
一般在nested loop中, 驱动表满足条件结果集不大,被驱动表的连接字段要有索引,这样就走nstedloop。如果驱动表返回记录太多,就不适合nested loops了。如果连接字段没有索引,则适合走hash join,因为不需要索引。
这段说的是oracle下nestedloop。在MySQL中,只有nestedloop。
nested loop的过程:选择row resource 最小的那个表作为驱动表(外部表),内部表要求有选择性高的index。 从外部表(驱动表)里一次取一行对内部表的每行进行比较,即外部表有几个distinct行,就有几次nested loop。
所以nested loop的代价是:
- cost = outer access cost + (inner access cost * outer cardinality)
outer access cost应该是读取驱动表到内存,而内部表要求有有效的index也是为了降低inner access cost,而驱动表要求小,也就很好理解了。
个人观点:当被驱动表的连接字段并没有建立索引时,用小结果集来驱动大结果集和用大结果集来驱动小结果集效果应该是一样的,都需要全表扫,无非就是m*n和n*m的关系
简朝阳在他的书中也有这么一段话:永远用小结果集驱动大结果集……此优化的前提条件是 通过join条件每次对各个表进行访问的资源消耗差别不是太大。
如果资源消耗有较大的差别(一般都是因为索引的区别),就不能简单的通过结果集的大小来判断join语句的驱动顺序,而是要通过比较循环次数和每次循环所须消耗之乘积大小来确定优化方案了。
原文标题: MySQL的join
连接:http://www.cnblogs.com/arlen/articles/1752456.html
以上的相关内容就是对MySQL数据库中的join 的介绍,望你能有所收获。
【编辑推荐】
- ASP.NET连接MySQL数据库的正确解决方案
- 启动与关闭MySQL的一大绝招
- MySQL免安装版-添加服务实操演示
- MySQL数据库中的自动备份破坏后的建立
- mssql转换为MySQL数据库经验漫谈