用于在Mysql中查找最大工资的左连接或分组

时间:2017-04-19 12:42:50

标签: mysql sql performance

我试图理解为什么人们普遍认为避免分组总是有益的。我的问题陈述是:从employee_id为外键的员工表中,找出员工最高工资为40000的那些部门

1按方法分组:

 select d.department_name , e.max_salary 
   from department d
   join ( select department_id, max(salary) as max_salary
   from emp 
   group by 1
   having max_salary = 40000 ) e
   on (d.department_id = e.department_id)

2现在左连接方法:

 select d.department_name, inner_q.salary
 from    department d
 join
 (select e.department_id , e.salary
  from  emp  e
  left join emp  e_inner
  on (e.department_id = e_inner.department_id and e.salary < e_inner.salary)
  where e_inner.department_id is null and e.salary = 40000 ) inner_q
  on (d.department_id = inner_q.department_id)

不幸的是,解释计划对我来说没有多大意义。任何帮助解释哪一个应该更好,为什么会非常感激。

1 个答案:

答案 0 :(得分:2)

你工作太辛苦了。

SELECT  department_name, MAX(salary) AS max_salary
    FROM  emp
    GROUP BY  department_name
    HAVING  max_salary >= 40000

这比任何带有子查询的版本都要快。

这会让它运行得更快:INDEX(department_name, salary)

(也许你想要>= 40000,而不是= 40000?)

此版本将对整个表格进行一次传递(或INDEX,如果添加“覆盖”索引),则收集每个部门的最高工资。然后它会丢弃HAVING子句失败的结果;交付其余部分。

对于在10K行的表上运行此GROUP BY,我不会有任何疑虑。一百万行的表会花费很多时间。但