You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优化两次查询同表的SQL语句,快速获取与部门经理姓氏相同的员工姓名

高效查询实现方案

核心优化思路

你原有两个写法性能差的原因分别是:

  1. 第一种写法用了相关子查询,关联结果的每一行都会触发一次对employees表的查询,索引利用效率极低
  2. 第二种写法先创建无索引的临时派生表再关联,临时表没有索引,关联时会产生大量全表扫描操作,性能反而更差

最优的实现方式是直接用多表等值关联替代相关子查询,所有关联操作都能利用表上已有的主键、外键索引,避免全表扫描:

SELECT CONCAT(e.first_name, ' ', e.last_name) AS employee_name
FROM employees e
-- 关联获取员工所属部门
JOIN dept_emp de ON e.emp_no = de.emp_no
-- 关联获取对应部门的经理编号
JOIN dept_manager dm ON de.dept_no = dm.dept_no
-- 关联获取经理的姓氏,直接在关联条件里匹配姓氏
JOIN employees m ON dm.emp_no = m.emp_no AND e.last_name = m.last_name;

进一步提效的索引优化建议

如果还需要更高的执行速度,可以添加以下联合索引,覆盖关联查询的所有字段,避免回表查询:

  • 给dept_emp表添加联合索引:INDEX idx_dept_emp_emp_dept (emp_no, dept_no)
  • 给dept_manager表添加联合索引:INDEX idx_dept_mgr_dept_emp (dept_no, emp_no)

这个方案的执行效率远高于你原有两个写法,尤其是数据量越大,性能提升越明显,完全避免了全表扫描操作。

内容的提问来源于stack exchange,提问作者Huy Le

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 02:09:00