MST

星途 面试题库

面试题:MySQL子查询转换为JOIN的复杂场景优化

有三个表,`employees`表(`employee_id`、`department_id`、`employee_name`等字段),`departments`表(`department_id`、`department_name`等字段),`projects`表(`project_id`、`department_id`、`project_name`、`project_start_date`等字段)。当前有一个子查询,查询在2023年启动项目的部门中所有员工的姓名,子查询为:`SELECT employee_name FROM employees WHERE department_id IN (SELECT department_id FROM projects WHERE YEAR(project_start_date) = 2023);` 请将该子查询转换为JOIN形式,并分析在大数据量下,如何进一步优化这个JOIN查询以提升性能,比如索引的使用策略等。
41.5万 热度难度
数据库MySQL

知识考点

AI 面试

面试题答案

一键面试
  1. 将子查询转换为JOIN形式
SELECT e.employee_name
FROM employees e
JOIN projects p ON e.department_id = p.department_id
WHERE YEAR(p.project_start_date) = 2023;
  1. 大数据量下的优化策略
    • 索引使用策略
      • projects表的project_start_date字段上创建索引,以加速YEAR(project_start_date) = 2023的过滤。例如:CREATE INDEX idx_project_start_date ON projects(project_start_date);
      • projects表的department_id字段上创建索引,以加速连接操作。例如:CREATE INDEX idx_project_department_id ON projects(department_id);
      • employees表的department_id字段上创建索引,以加速连接操作。例如:CREATE INDEX idx_employee_department_id ON employees(department_id);
    • 查询执行计划分析: 使用EXPLAIN关键字分析查询执行计划,例如:EXPLAIN SELECT e.employee_name FROM employees e JOIN projects p ON e.department_id = p.department_id WHERE YEAR(p.project_start_date) = 2023;,根据执行计划的输出,进一步调整索引或查询结构。
    • 分区表: 如果projects表数据量巨大,可以考虑对projects表按project_start_date进行分区,比如按年份分区。这样在查询特定年份启动项目时,可以快速定位到相关分区,减少扫描的数据量。