加载中...

嵌套循环连接(Nested Loop Join)是最基础的连接算法:遍历外表(驱动表)的每一行,对每行到内表中查找满足连接条件的匹配行,形如两层嵌套循环。
朴素嵌套循环对内表做全表扫描,复杂度为两表行数之积,仅适合极小的表;索引嵌套循环(Index Nested Loop)利用内表连接列上的索引把内层查找降为索引定位,是 OLTP 场景最常用的形态;块嵌套循环(Block Nested Loop)按批缓存外表行以减少内表扫描次数,MySQL 8.0 中已被哈希连接取代。
外表经过滤后行数很少、内表连接列有高效索引时,嵌套循环几乎总是最优选择;它还是唯一天然支持非等值连接条件的通用算法,且能以流水线方式尽早返回首行,适合分页与 Top-N 查询。
驱动表的选择至关重要:应让过滤后行数更少的一方作外表。优化器基于基数估计决定驱动顺序,估计失误时常见的症状就是"大表驱动小表"导致内表被海量探测,这也是慢查询分析的常见切入点。

登录 后参与讨论
暂无讨论,来发表第一条评论吧