哪一个是更好的查询,为什么?

时间:2015-04-09 13:21:33

标签: sql mysqli

我必须得到部门的名称和其中的员工数量。测试是我的架构。

所以我提出两个问题给我相同的结果 -

第一

SELECT Department.Departmentname, 
                            (
                                SELECT COUNT(*)
                                FROM test.Employee
                                WHERE Employee.Departmentid = Department.idDepartment
                            ) AS NumberOfEmployees
FROM test.Department;

第二

SELECT Department.Departmentname AS NAme,COUNT(Employee.idEmployee) AS Employee_COUNT 
FROM test.Department 
LEFT JOIN test.Employee 
ON Employee.Departmentid = Department.idDepartment 
GROUP BY Employee.Departmentid ;

这两项中哪一项是获得所需结果的最佳和最有效的方法?欢迎任何其他解决方案。

请解释为什么特定解决方案更好

请参阅:我是MySQL新手。试着学习最佳实践。

1 个答案:

答案 0 :(得分:2)

用于表达逻辑的

我的首选项是第二个查询,我将其写为:

SELECT d.Departmentname AS Name, COUNT(e.idEmployee) AS Employee_COUNT 
FROM test.Department d LEFT JOIN
     test.Employee e
     ON e.Departmentid = d.idDepartment 
GROUP BY d.Departmentname;

请注意表别名的使用以及GROUP BY使用与SELECT相同的列的事实。但是,在MySQL中,此查询不会在DepartmentName上使用group by的索引。这意味着GROUP BY正在进行文件排序,这是一项相对昂贵的操作。

当您编写如下查询时:

SELECT d.Departmentname, 
       (SELECT COUNT(*)
        FROM test.Employee e
        WHERE e.Departmentid = d.idDepartment
       ) AS NumberOfEmployees
FROM test.Department d;

不需要明确的group by。使用Employee(DepartmentId)上的索引,这将使用count(*)的索引,因此该版本通常在MySQL中表现更好。

在您开始拥有数千或数十万行之前,性能差异可能微不足道。