Mysql SQL查询性能评估

Mysql SQL查询性能评估,mysql,sql,performance,Mysql,Sql,Performance,我目前有两个版本的SQL query,我正在努力了解哪个版本在性能、成本等方面会更好 这就是这个问题: 哪个更好?join真的有必要吗?要确定哪个“更好”,您应该测试性能。有时,使用相关子查询的性能要比显式的join方法好得多 当你问:“加入真的有必要吗?”我想你的意思是“加入真的有必要吗?”。显然,有时可以在没有显式的联接的情况下表示查询。不过,在后台,数据库正在实现一个连接算法(可能是嵌套循环或索引查找)来完成这项工作 这基本上回答了这个问题。SQL通常提供多种方法来实现相同的目标。因此,您

我目前有两个版本的SQL query,我正在努力了解哪个版本在性能、成本等方面会更好

这就是这个问题:

哪个更好?join真的有必要吗?

要确定哪个“更好”,您应该测试性能。有时,使用相关子查询的性能要比显式的
join
方法好得多

当你问:“加入真的有必要吗?”我想你的意思是“加入真的有必要吗?”。显然,有时可以在没有显式的
联接的情况下表示查询。不过,在后台,数据库正在实现一个连接算法(可能是嵌套循环或索引查找)来完成这项工作


这基本上回答了这个问题。SQL通常提供多种方法来实现相同的目标。因此,您通常可以使用
join
或不使用
join
来表示逻辑。只有一个警告:相关子查询实际上相当于
左连接
,而不是
内部连接

如果您不知道如何读取MySQL的执行计划,请仔细阅读。这将帮助您更好地比较这两个查询。就我个人而言,我总是避免在选择列表中嵌套相关查询,因为我认为它丑陋且难以阅读。我会一直使用join方法,如果你是hip的话,也会使用同样的方法。正如@Shawn所说的,检查执行计划。如果它们完全相同,我不会感到惊讶,在这种情况下可读性是关键。请使用联接中的每一列所在的表来限定联接中的每一列。您正在运行哪个版本?请在每种情况下提供
解释选择…
select department_salary.pay_month, department_id,
case
  when department_avg>company_avg then 'higher'
  when department_avg<company_avg then 'lower'
  else 'same'
end as comparison
from
(
  select department_id,
         avg(amount) as department_avg,
         date_format(pay_date, '%Y-%m') as pay_month
      from salary
      join employee on salary.employee_id = employee.employee_id
      group by department_id, pay_month
) as department_salary
join
(
  select avg(amount) as company_avg,
         date_format(pay_date, '%Y-%m') as pay_month
      from salary
      group by date_format(pay_date, '%Y-%m')
) as company_salary
on department_salary.pay_month = company_salary.pay_month
;
select a.pay_month,
       a.department_id,
       (case when avg(a.salary) > (
             select avg(e.salary)
                 from employee e
                 where e.pay_month = a.pay_month)
        then 'higher'
        else 'lower' end) as comparison
from employee a
group by a.pay_month,a.department_id;