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