重用子查询中的计算数据

时间:2014-06-07 13:26:15

标签: mysql subquery workbench

首先,我是SQL新手。 所以我有两张桌子 dept_emp 标题。 我的问题是,当我有这样一个选择查询时,我需要~2secs(我很好)

select  dept_no 
from dept_emp,titles
where titles.emp_no = dept_emp.emp_no
    and titles.title = 'Engineer'
group by dept_emp.dept_no
having count(*) < 1000);

当我将其用作类似

之类的子查询时
select dept_emp.emp_no
from dept_emp
where dept_emp.dept_no in (
    select  dept_no 
    from dept_emp,titles
    where titles.emp_no = dept_emp.emp_no
        and titles.title = 'Engineer'
    group by dept_emp.dept_no
    having count(*) < 1000)
limit 10;

执行时间大约为100秒。 如果我的限制是1000+数据,则执行时间会变为无穷大。

如何重用我在子查询中使用的数据? 如果我可以将内部查询转换为连接,那么最后会更有效吗?

1 个答案:

答案 0 :(得分:1)

确保dept_emp.dept_no被编入索引(和(emp_no,title))...

SELECT x.emp_no
  FROM dept_emp x
  JOIN 
     ( SELECT dept_no 
         FROM dept_emp de
         JOIN titles t   
           ON t.emp_no = de.emp_no
        WHERE t.title = 'Engineer'
        GROUP 
           BY de.dept_no
       HAVING COUNT(*) < 1000
     ) y
    ON y.dept_no = x.dept_no
 ORDER 
    BY emp_no
 LIMIT 10;