我正在尝试学习数据库,并且有一个在线课程,我必须使用以下SQL数据库源来加载数据库,这更像是其网站上列出的示例MYSQL数据库,因此我认为加载是非常安全的。
https://github.com/datacharmer/test_db
无论如何,下面提到的查询旨在计算并给出薪水最高的员工,employee_name,部门名称(按部门划分)。该查询耗时很长,如何识别瓶颈?
我同时使用本机外壳客户端和Sequel Pro来执行相同的查询,看来它们只是挂了。
select employees.emp_no, employees.first_name, employees.last_name, salaries.salary, departments.dept_name
from employees
INNER JOIN salaries on employees.emp_no = salaries.emp_no
INNER JOIN dept_emp on employees.emp_no = dept_emp.emp_no
INNER JOIN departments on dept_emp.dept_no = departments.dept_no
where salaries.salary IN (select MAX(salaries.salary)
from salaries
GROUP BY departments.dept_no);
use employees;
表架构:
mysql> desc dept_emp;
+-----------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+---------+------+-----+---------+-------+
| emp_no | int(11) | NO | PRI | NULL | |
| dept_no | char(4) | NO | PRI | NULL | |
| from_date | date | NO | | NULL | |
| to_date | date | NO | | NULL | |
+-----------+---------+------+-----+---------+-------+
mysql> desc employees;
+------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+---------------+------+-----+---------+-------+
| emp_no | int(11) | NO | PRI | NULL | |
| birth_date | date | NO | | NULL | |
| first_name | varchar(14) | NO | | NULL | |
| last_name | varchar(16) | NO | | NULL | |
| gender | enum('M','F') | NO | | NULL | |
| hire_date | date | NO | | NULL | |
+------------+---------------+------+-----+---------+-------+
6 rows in set (0.01 sec)
mysql> desc salaries;
+-----------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+---------+------+-----+---------+-------+
| emp_no | int(11) | NO | PRI | NULL | |
| salary | int(11) | NO | | NULL | |
| from_date | date | NO | PRI | NULL | |
| to_date | date | NO | | NULL | |
+-----------+---------+------+-----+---------+-------+
4 rows in set (0.00 sec)
mysql> desc departments;
+-----------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| dept_no | char(4) | NO | PRI | NULL | |
| dept_name | varchar(40) | NO | UNI | NULL | |
+-----------+-------------+------+-----+---------+-------+
2 rows in set (0.00 sec)
答案 0 :(得分:2)
代替基于不完整查询的IN子句
尝试使用内部联接对按dept_id的最高薪资组进行子查询
select employees.emp_no
, employees.first_name
, employees.last_name
, salaries.salary
, departments.dept_name
from employees
INNER JOIN salaries on employees.emp_no = salaries.emp_no
INNER JOIN dept_emp on employees.emp_no = dept_emp.emp_no
INNER JOIN departments on dept_emp.dept_no = departments.dept_no
INNER JOIN (
select departments.dept_no, max(salaries.salary) max_sal
from employees
INNER JOIN salaries on employees.emp_no = salaries.emp_no
INNER JOIN dept_emp on employees.emp_no = dept_emp.emp_no
INNER JOIN departments on dept_emp.dept_no = departments.dept_no
group by departments.dept_no
) t on t.dept_no = departments.dept_no AND t.max_sal = salaries.salary