MySQL查询似乎挂起了

MySQL查询似乎挂起了,mysql,Mysql,我正在尝试学习数据库,有一个在线课程,我必须用下面的SQL数据库源加载数据库,这更像是他们网站上列出的示例MYSQL数据库,所以我认为加载是非常安全的 不管怎么说,下面提到的查询的目的是计算并给出,工资最高的员工,员工名称,按每个部门分组的部门名称。这个查询需要很长时间,我如何识别瓶颈?
 我正在使用原生shell客户端和Sequel Pro来执行相同的查询,看起来它们只是挂起了 select employees.emp_no, employees.first_name, employees.l

我正在尝试学习数据库,有一个在线课程,我必须用下面的SQL数据库源加载数据库,这更像是他们网站上列出的示例MYSQL数据库,所以我认为加载是非常安全的

不管怎么说,下面提到的查询的目的是计算并给出,工资最高的员工,员工名称,按每个部门分组的部门名称。这个查询需要很长时间,我如何识别瓶颈?


我正在使用原生shell客户端和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)

而不是基于不完整查询的IN子句

尝试按部门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

而不是基于不完整查询的IN子句

尝试按部门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

不能按其他表中的值进行分组。移动支架:。。。。。来自按部门划分的薪资组。部门编号;也许你必须为MAXsalary添加一些条件。我确实将其从部门工资组中移到了括号中;我得到了错误1055 42000:SELECT列表的表达式1不在GROUP BY子句中,并且包含未聚合的列'employees.emp_no',该列在功能上不依赖于GROUP BY子句中的列;这与sql_mode=only_full_group_by不兼容。您不能根据另一个表中的值进行分组。移动支架:。。。。。来自按部门划分的薪资组。部门编号;也许你必须为MAXsalary添加一些条件。我确实将其从部门工资组中移到了括号中;我得到了错误1055 42000:SELECT列表的表达式1不在GROUP BY子句中,并且包含未聚合的列'employees.emp_no',该列在功能上不依赖于GROUP BY子句中的列;这与sql_mode=only_full_group_byok不兼容我试图按原样执行您的查询,出现错误114042000:在不带分组依据的聚合查询中,选择列表的表达式1包含未聚合列“employees.departments.dept_no”;这与sql_mode=only_full_group_bymysql版本mysql Ver 14.14 Distrib 5.7.24不兼容,适用于macos10.14 x86_64,使用EditLine wrapperok工作,但是你能告诉我为什么我的实现失败了而你的成功了吗?在你的maxsalary子查询不完整的情况下,你没有部门和薪水之间的连接…结果我怀疑是否返回结果。。。更可能的是,可以在两个表之间的笛卡尔积上尝试一个错误。。。子查询使用您提到的内容创建临时表。。这个结果被加入到主查询中,我试图按原样执行您的查询,我得到了这个错误,错误114042000:在没有分组依据的聚合查询中,选择列表的表达式1包含未聚合的列“employees.departments.dept_no”;这与sql_mode=only_full_group_bymysql版本mysql Ver 14.14 Distrib 5.7.24不兼容,适用于macos10.14 x86_64,使用EditLine wrapperok工作,但是你能告诉我为什么我的实现失败了而你的成功了吗?在你的maxsalary子查询不完整的情况下,你没有部门和薪水之间的连接…结果我怀疑是否返回结果。。。更可能的是,可以在两个表之间的笛卡尔积上尝试一个错误。。。子查询使用您提到的内容创建临时表。。这个结果被连接到主查询