首先,我是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+数据,则执行时间会变为无穷大。
如何重用我在子查询中使用的数据? 如果我可以将内部查询转换为连接,那么最后会更有效吗?
答案 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;