SELECT
*
FROM
employees
WHERE
emp_no IN ( SELECT emp_no FROM dept_emp WHERE dept_no = 'd005' )
LIMIT 10;
SELECT
*
FROM
employees e
WHERE
EXISTS ( SELECT * FROM dept_emp de WHERE dept_no = 'd005' AND e.emp_no = de.emp_no )
LIMIT 10;
- 上述两个查询,其查询结果是一样的。
- in中的子查询是独立子查询。exists中是相关子查询。
- 独立查询可以先查询,因为不需要依赖其他查询。
- 相关子查询执行顺序需要后于其依赖的查询。
- 基于小表驱动大表的思想。如果子查询是小表,则用in比较好。如果子查询是大表,则用exists比较好。
- 但实际上,mysql5.7中,in的优化要好于exists。一般无论外层是大表还是小表,一般in的效率都比exists的要好或者差不多。
- in查询中,如果子查询是独立子查询,在mysql5.7中,可以将独立子查询优化成物化表,然后外层表与物化表做内连接查询。对于优化后的内连接查询,mysql自动选择小表作为驱动表,然后大表走索引,所以不管怎么样,在mysql5.7中in的效率都不低于exists。
|