如何优化此 SQL 查询,其中 select 来自同一 table 两次
How to optimize this SQL query which select from the same table twice
我正在使用此处提供的员工测试数据库: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
搜索整个 table。我假设这意味着对于连接的 table 的每一行,它将是整个 employees
table。
我试图通过在加入之前创建一个更小的 table 来解决它,但它甚至慢了 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);
SELECT
CONCAT_WS(' ', first_name, last_name) AS fullName
FROM employees
JOIN dept_emp ON dept_emp.emp_no=employees.emp_no
JOIN dept_manager ON dept_manager.dept_no=dept_emp.dept_no
# added after comment from Rick James
AND dept_manager.from_date <= emp.end_date
AND emp.from_date <= dept_manager.to_date
JOIN employees managers ON managers.emp_no=dept_manager.emp_no
AND managers.last_name=employees.lastname
从我的头顶。之间没有测试。
并添加索引:
last_name
ALTER TABLE `employees`
ADD INDEX `idx_lastName`(`last_name`) USING BTREE;
我正在使用此处提供的员工测试数据库: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
搜索整个 table。我假设这意味着对于连接的 table 的每一行,它将是整个 employees
table。
我试图通过在加入之前创建一个更小的 table 来解决它,但它甚至慢了 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);
SELECT
CONCAT_WS(' ', first_name, last_name) AS fullName
FROM employees
JOIN dept_emp ON dept_emp.emp_no=employees.emp_no
JOIN dept_manager ON dept_manager.dept_no=dept_emp.dept_no
# added after comment from Rick James
AND dept_manager.from_date <= emp.end_date
AND emp.from_date <= dept_manager.to_date
JOIN employees managers ON managers.emp_no=dept_manager.emp_no
AND managers.last_name=employees.lastname
从我的头顶。之间没有测试。
并添加索引: last_name
ALTER TABLE `employees`
ADD INDEX `idx_lastName`(`last_name`) USING BTREE;