MySQL查询似乎挂起了
我正在尝试学习数据库,有一个在线课程,我必须用下面的SQL数据库源加载数据库,这更像是他们网站上列出的示例MYSQL数据库,所以我认为加载是非常安全的 不管怎么说,下面提到的查询的目的是计算并给出,工资最高的员工,员工名称,按每个部门分组的部门名称。这个查询需要很长时间,我如何识别瓶颈? 我正在使用原生shell客户端和Sequel Pro来执行相同的查询,看起来它们只是挂起了MySQL查询似乎挂起了,mysql,Mysql,我正在尝试学习数据库,有一个在线课程,我必须用下面的SQL数据库源加载数据库,这更像是他们网站上列出的示例MYSQL数据库,所以我认为加载是非常安全的 不管怎么说,下面提到的查询的目的是计算并给出,工资最高的员工,员工名称,按每个部门分组的部门名称。这个查询需要很长时间,我如何识别瓶颈? 我正在使用原生shell客户端和Sequel Pro来执行相同的查询,看起来它们只是挂起了 select employees.emp_no, employees.first_name, employees.l
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子查询不完整的情况下,你没有部门和薪水之间的连接…结果我怀疑是否返回结果。。。更可能的是,可以在两个表之间的笛卡尔积上尝试一个错误。。。子查询使用您提到的内容创建临时表。。这个结果被连接到主查询