优化原则:小表驱动大表,即小的数据集驱动大的数据集。
先来了解两个关键字:in和exists。建立两个表,员工表和部门表。分别用两个关键字来查询,一般员工表为大数据集,部门表为小数据集。
in:
SELECT * FROM t_emp WHERE dept_id IN (SELECT dept_id FROM t_dept) LIMIT 5;
相当于:
for SELECT dept_id FROM t_dept for SELECT * FROM t_emp WHERE t_emp.dept_id = t_dept.dept_id
先子查询,后主查询,即先查询部门,然后查询部门下的员工,即小表驱动大表。
exists:
SELECT * FROM t_emp WHERE EXISTS (SELECT 1 FROM t_dept WHERE t_dept.dept_id = t_emp.dept_id);
相当于:
for SELECT * FROM t_emp for SELECT * FROM t_dept WHERE t_dept.dept_id = t_emp.dept_id
先查员工表,再根据部门id查部门中是否存在,返回true or false,再决定员工表数据是去是留。大表驱动小表,查询效率较低。
扩展:
两个关键字可以反过来用,t_emp大于t_dept时,用in;小于时用exists。