(非常)简短概览 MySQL 连接的工作原理

发布: (2025年12月4日 GMT+8 21:00)
3 min read
原文: Dev.to

Source: Dev.to

MySQL 连接是如何工作的

MySQL 使用 嵌套循环连接(Nested‑Loop Join,NLJ) 算法来评估连接。通俗来说,它从第一张表取出一行,在下一张表中扫描匹配的行,然后对后续的表重复此过程。在最坏情况下,这会导致 O(n²) 的时间复杂度,但内置的优化会让实际性能远低于此。

示例连接

SELECT *
FROM t1
JOIN t2 ON t1.t2_id = t2.id
JOIN t3 ON t2.t3_id = t3.id;

NLJ 算法的伪代码

for each row in t1
    for each t2 matching t1.t2_id
        for each t3 matching t2.t3_id
            return row if join condition is met

每个内部循环都会针对其外层循环的每一行执行,因此当表很大时,尤其是没有 WHERE 子句或索引时,成本会迅速增长。

条件下推

MySQL 会进行 条件下推,即在每一层循环时就评估 WHERE 子句的相关部分,而不是在所有连接完成后再评估。

SELECT *
FROM t1
JOIN t2 ON t1.t2_id = t2.id
JOIN t3 ON t2.t3_id = t3.id
WHERE t2.status = 'active';

在这个查询中,MySQL 在遍历 t2 时就过滤 t2.status = 'active',仅把符合条件的行传递给 t3 检查,从而避免了对不必要的行进行连接。

优化建议

  • 为连接条件和 WHERE 子句中使用的列添加选择性索引。索引使 MySQL 能跳过无关的行,显著降低扫描量。
  • 为增长做好规划:随着表的变大,即使是已建立索引的连接也可能变得昂贵。可以考虑:
    • 在适当的情况下通过反规范化来减少复杂连接的需求。
    • 对大表进行分区。
    • 审查查询模式并对其进行重构以提升效率。

在模式设计和索引方面进行一点前瞻性的工作,日后可以省去大量的性能痛苦。

Back to Blog

相关文章

阅读更多 »