【mysql系列】阿里巴巴的规范里为什么不建议3张表以上的left join查询,mysql left join查询是怎么实现的,为什么要禁止多表的left join查询
规范里说明,不能在3张表以上的查询中使用 left join查询,这是为什么呢?
首先我们看看mysql是如何实现left join这种查询的,
答: mysql 使用 nested loop join 嵌套循环的方式实现join查询
就是两层循环,第一张表做外循环outter loop ,第二张表做循环inner loop,双层循环。外循环的每条记录都要和内循环的每条记录进行比较 ,符合条件就输出。
嵌套循环 具体算法上就是有3种:
1. simple nested loop join 简单的嵌套循环
2. block nested loop join 缓存的嵌套循环
3. index nested loop join 索引的嵌套循环
· simple nested loop join 性能最差,简单的两张表全表扫描, 复杂度就是 O(N²)
· index nested loop join 基于索引的嵌套循环,好点,当内循环的查询,可以使用到索引的时候,就会根据索引进行查询, O(logN)
· block nested loop join 基于缓存的嵌套循环,就是用到了 buffer, 当外循环查询的时候,查询到的数据会放在多个join buffer中 然后内循环的时候,每行数据和每个buffer中的数据进行比较,从而检查查询次数, 复杂度是 O(N*M) -- M就是join buffer的个数。
知道了上面这3种情况后,就知道表越多, 表中数据越多的时候,join查询的性能会越来越低。所以不建议使用 join 多表查询。这就是理由。