(非常)简短概览 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 能跳过无关的行,显著降低扫描量。 - 为增长做好规划:随着表的变大,即使是已建立索引的连接也可能变得昂贵。可以考虑:
- 在适当的情况下通过反规范化来减少复杂连接的需求。
- 对大表进行分区。
- 审查查询模式并对其进行重构以提升效率。
在模式设计和索引方面进行一点前瞻性的工作,日后可以省去大量的性能痛苦。