MySQL用Nested-Loop Join算法实现join查询 区分驱动表和被驱动表,以驱动表的结果集为循环的基础,访问被驱动表过滤数据,然后合并结果,驱动表在外循环、被驱动表在内循环。 如果还有
MySQL用Nested-Loop Join算法实现join查询区分驱动表和被驱动表,以驱动表的结果集为循环的基础,访问被驱动表过滤数据,然后合并结果,驱动表在外循环、被驱动表在内循环。 left join中的左表是驱动表、右表是被驱动表,right join刚好相反。 Nested-Loop Join有三种实现SNLJ Simple Nested-Loop Join 假设A是驱动表,B是被驱动表。 这里会扫描A表,用A的结果集作为外循环, A表有N行,B表有M行。 SNLJ的开销如下(最大情况下): 扫描A表1次; 为了专注于理解Nested-Loop Join,这里不讨论带where子句的情况,以下相同。 BNLJ Block Nested-Loop Join 假设A是驱动表,B是被驱动表。 用来join的字段在被驱动表没有建立索引 Join Buffer Join Buffer默认大小256k,会生成n-1个Join Buffer缓冲区,n为参与join查询的表数量。 A表有N行,B表有M行。 BNLJ的开销如下(最大情况下): 扫描A表1次; INLJ Index Nested-Loop Join 假设A是驱动表,B是被驱动表。 用来join的字段在被驱动表建立了索引 聚集索引 非聚集索引 在这里我们假设您已对MySQL的索引结构有了一定的了解, 这里会扫描A表,用A的结果集作为外循环, A表有N行,B表有M行。 INLJ的开销如下(最大情况下): 扫描A表1次; NLJ优先级 INLJ>BNLJ>SNLJ 如何优化join查询效率 尽量将小表作为驱动表,大表作为被驱动表; inner join时,MySQL会自动将小表作为驱动表,大表作为被驱动表。 扫描整张表是成本非常高的操作。 |
2021-06-02
2021-06-05
2022-06-27
2022-10-12
2019-09-11