【发布时间】:2021-12-19 10:13:32
【问题描述】:
我正在使用员工测试数据库,可在此处获得:https://github.com/datacharmer/test_db
我正在尝试获取与经理姓氏相同的员工的姓名。我希望使下面的查询更快。
SELECT concat(first_name,' ',last_name)
FROM
((employees JOIN dept_emp ON employees.emp_no=dept_emp.emp_no)
JOIN dept_manager ON dept_emp.dept_no=dept_manager.dept_no)
WHERE employees.last_name=
(SELECT last_name FROM employees WHERE employees.emp_no=dept_manager.emp_no);
如您所见,where 子句中有一个select 用于搜索整个表。我假设这意味着对于连接表的每一行,它将是整个 employees 表。
我试图通过在加入之前创建一个较小的表来解决它,但它甚至慢了 4 倍。
SELECT concat(B.first_name,' ',B.last_name)
FROM
(SELECT employees.emp_no, employees.last_name, dept_no
FROM employees JOIN dept_manager ON employees.emp_no=dept_manager.emp_no) AS A
JOIN
(SELECT employees.first_name, employees.emp_no, last_name, dept_no
FROM employees JOIN dept_emp ON employees.emp_no=dept_emp.emp_no) AS B
ON (A.dept_no=B.dept_no AND A.last_name=B.last_name);
【问题讨论】:
-
什么版本的 MySQL? 8.0 有
WITH。 -
8.0版,你能写一个查询吗?索引显然使事情变得更快,所以我只是在寻找查询改进
-
一个部门可以有多个经理吗?如果没有,删除表
dept_manager并在表departments中添加dept_emp_no。如果您想记录谁在何时为某个部门工作并跟踪他们的动向? -
嗯,模式已经给出,所以我不能改变它。每个部门可以有超过 1 名经理,但在不同的时间(基本上是历史)
-
您想要当前员工的姓名...?
to_date是未来的某个时间吗?或者NULL的意思是“当前”?否则,很难在不知情的情况下优化查询。
标签: mysql sql query-optimization