MySQL查询似乎正在挂起

时间:2019-01-25 19:57:02

标签: mysql

我正在尝试学习数据库,并且有一个在线课程,我必须使用以下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)

1 个答案:

答案 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