Index Nested Loop Join(索引嵌套循环连接)
Index Nested Loop Join 是一种利用索引加速连接操作的算法,通过将内表的索引用于快速查找匹配记录,显著减少 I/O 操作。
优缺点
优点
- 快速查找: 利用索引定位内表记录,避免完整扫描内表。
- 高效: 索引查找成本 CCC 通常较低(例如 B+树索引的查找成本接近 logN)。
缺点
- 依赖索引: 内表必须有索引,否则无法使用这种算法。
- 索引查找成本: 如果索引查找不够高效,或者索引高度较高,成本会增加。
- 随机访问: 索引查找可能导致较多的随机 I/O,尤其当内表数据未按索引顺序存储时。
性能对比与适用场景
特点 | Index Nested Loop Join | Block Nested Loop Join |
---|---|---|
内表的访问方式 | 使用索引快速查找 | 完整扫描内表 |
外表的加载方式 | 每次一条记录 | 每次加载一个块 |
适用场景 | 内表有索引,且索引查找成本低 | 无索引,或者内存有限,适合小外表 |
I/O 模式 | 随机 I/O(索引查找) | 顺序 I/O(完整扫描) |
总成本公式 | M+(m⋅C) | M+⌈M/(B−2)⌉⋅N |
总结
- 核心原理: 利用内表的索引,加速 Join 操作。
- 通俗比喻: 用电话号码簿查找联系人,避免挨家挨户敲门。
- 适用场景: 内表有索引,外表较小或查询条件明确时效果显著。
- 局限性: 依赖索引支持,且可能产生随机 I/O。