当多表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: Loop join, MySQL
Comments are closed.