如何优化两次查询同表的SQL语句,快速获取与部门经理姓氏相同的员工姓名
高效查询实现方案
核心优化思路
你原有两个写法性能差的原因分别是:
- 第一种写法用了相关子查询,关联结果的每一行都会触发一次对
employees表的查询,索引利用效率极低 - 第二种写法先创建无索引的临时派生表再关联,临时表没有索引,关联时会产生大量全表扫描操作,性能反而更差
最优的实现方式是直接用多表等值关联替代相关子查询,所有关联操作都能利用表上已有的主键、外键索引,避免全表扫描:
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
相关产品推荐
相关产品推荐

