嵌套join 算法

8月 24, 2014 |

当多表join时, 会先从第一个表读取一行,然后去第二个表找对应的行,然后去第三个表找对应的行,如同我们自己写程序一样,嵌套循环处理。
明显这样处理效率太低了,优化呗,最直接的优化就是使用缓存啦,所以join_buffer_size这个变量登上了舞台。MySQL还为其取了一个美丽的名字(Block Nested-Loop Join )块嵌套join,

假如你有如下的Join:

表名称???????? join类型
t1???????????? range
t2?????? ?????ref
t3???????????? ALL

这个join将按照如下算法完成:

- While 当 t1 表的行满足where
- 根据t1的引用key扫描t2表的所有行
- 将来自t1, t2的行存入缓存
- 如果缓存满
- 扫描t3表的所有行
- 比较t3的行和在缓存中t1,t2行的组合
- 如果行满足join条件,发送改行到客户端
- 清空缓存
- 读t3中的所有行
-比较t3的行和在缓存中t1,t2行的组合
-如果行满足join条件,发送改行到客户端

Posted in: MySQL practise | Tags: ,

Comments are closed.