查询语句
SELECT
d.department_name,
AVG(s.salary) AS average_salary
FROM
employees e
JOIN
departments d ON e.department_id = d.department_id
JOIN
salaries s ON e.employee_id = s.employee_id
GROUP BY
d.department_name
ORDER BY
average_salary DESC;
多表连接结构优化
- 索引优化:
- 在
employees
表的department_id
和employee_id
字段上创建索引。可以使用以下语句创建:
CREATE INDEX idx_employees_department_id ON employees(department_id);
CREATE INDEX idx_employees_employee_id ON employees(employee_id);
- 在
departments
表的department_id
字段上创建索引:
CREATE INDEX idx_departments_department_id ON departments(department_id);
- 在
salaries
表的employee_id
字段上创建索引:
CREATE INDEX idx_salaries_employee_id ON salaries(employee_id);
索引可以加快连接条件的匹配速度,从而提升查询性能。
- 查询执行计划分析:
使用数据库提供的工具(如MySQL的
EXPLAIN
关键字)分析查询执行计划。例如:
EXPLAIN SELECT
d.department_name,
AVG(s.salary) AS average_salary
FROM
employees e
JOIN
departments d ON e.department_id = d.department_id
JOIN
salaries s ON e.employee_id = s.employee_id
GROUP BY
d.department_name
ORDER BY
average_salary DESC;
根据执行计划的结果,进一步调整查询结构或者索引策略。例如,如果发现某个表的扫描方式不合理,可以尝试调整连接顺序或者添加合适的索引。
- 减少数据传输:
如果查询涉及到大数据量的表,可以考虑在连接之前对表进行筛选,减少参与连接的数据量。例如,如果
employees
表中有一个is_active
字段表示员工是否在职,可以先筛选出在职员工:
SELECT
d.department_name,
AVG(s.salary) AS average_salary
FROM
(SELECT * FROM employees WHERE is_active = true) e
JOIN
departments d ON e.department_id = d.department_id
JOIN
salaries s ON e.employee_id = s.employee_id
GROUP BY
d.department_name
ORDER BY
average_salary DESC;
这样可以减少中间结果集的大小,提升查询性能。