select * from t1 join t2 on t1.c = t1.c
这样的语句,MysqL优化器会选择t_a或t_b作为驱动表, 使用straight_join来指定 左边的表为驱动表。如果字段c上有建立索引,MysqL会使用 Index nested-Loop Join 策略处理join,否则会使用Block nested-Loop Join 来处理。
什么是Index nested-Loop Join
如果连接表的字段上索引,会使用index nested-loop join 算法,会这样处理:
- 从驱动表t1取出记录一行记录R;
- 根据连接字段去t2搜索;
- 取出匹配的t2记录,跟R组成一行,作为结果集的一部分。
- 重复值执行以上步骤,直到扫描完t1
什么是 Block neste-Loop Join
由于连接字段没有索引,这次不能通过走树索引去查询t2表了。查询过程如下:
- 扫描t1,顺序读数据放入join_buffer, 如果join_buffer满了,则分多次存入。
- 扫描t2,与join_buffer中的记录对比
- 清空join_buffer
- 重复上面步骤,直到t1扫描完成。
这个过程中,t2会被扫描多次,减少t1加载进join_buffer的次数,可以优化查询效率。join_buffer_size 参数控制了join_buffer的大小,如果join很慢,尝试改大这个join_buffer_size。
驱动表会被分多次放进join_buffer_size, 因此驱动表越小越好
Block nested-Loop join 会占用大量的系统资源,如果在explain结果中,看到Block nested Loop,尝试在连接的字段加索引吧
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。