JOIN查询的效率更高,主要原因如下:
1. 执行方式与扫描次数差异
• 关联子查询:
每处理外部查询的一行记录时,都会触发一次内部子查询的执行(即每次都要扫描一次Employee
表以匹配managerId
)。对于大表,这种嵌套循环会导致时间复杂度接近 O(N²),性能随数据量增长急剧下降。
SELECT name AS Employee
FROM Employee e1
WHERE salary > (SELECT salary FROM Employee e2 WHERE e1.managerId = e2.id);
• JOIN查询:
通过LEFT JOIN
一次性关联两个表,仅需扫描两次表(或利用索引),时间复杂度为 O(N)。数据库优化器更擅长优化连接操作,尤其是当索引存在时。
SELECT E1.name AS Employee
FROM Employee E1
LEFT JOIN Employee E2 ON E2.id = E1.managerId
WHERE E1.salary > E2.salary;
2. 索引利用效率
• 如果Employee
表的id
和managerId
字段已建立索引:
• 子查询版本:可能无法有效利用索引,导致全表扫描。
• JOIN版本:可通过索引快速定位关联记录(如managerId
与id
的索引),大幅减少磁盘I/O。
3. 数据库引擎优化差异
• 现代数据库(如MySQL、PostgreSQL)对JOIN
的优化更成熟,可能自动选择哈希连接(Hash Join)或合并连接(Merge Join),而子查询可能被转换为效率较低的嵌套循环连接。
• 测试数据(如网页5中MySQL千万级数据查询耗时对比)表明,非索引字段的关联查询在JOIN模式下性能显著优于子查询。