阿里数据库开发规范解释:关联查询,为什么要建议小表驱动大表?( 二 )

我们可以将EXISTS 语法理解为:将主查询的数据放在子查询中做条件验证,根据结果TRUE 和 FALSE 来决定主查询中的数据是否需要保留 。EXISTS 子查询只返回TRUE 或 FALSE ,因此子查询中的SELECT * 可以是SELECT 1 或者其他,MySql 的官方说在实际执行时会忽略SELECT 清单,因此是没有 什么区别的 。EXISTS 子查询其实在执行时,MySql 已经对它做了一些优化并不是对每条数据进行对比 。
二、总结在实际操作过程中我们要对两张表的dept_id 都设置索引 。在一开始我们就讲了一个优化原则即:小表驱动大表,在我们使用IN 进行关联查询时,通过上面IN 操作的执行顺序,我们是先查询部门表再根据部门表查出来的id 信息查询员工信息 。我们都知道员工表肯定会有很多的员工信息,但是部门表一般只会有很少的数据信息,我们事先通过查询部门表信息查询员工信息,以小表(t_dept)的查询结果,去驱动大表(t_emp),这种查询方式是效率很高的,也是值得提倡的 。
但是我们使用EXISTS 查询时,首先查询员工表,然后根据部门表的查询条件返回的TRUE 或者 FALSE ,再决定员工表中的信息是否需要保留 。这不就是用大的数据表(t_emp) 去驱动小的数据表小的数据表(t_dept)了吗?虽然这种方式也可以查出我们想要的数据,但是这种查询方式是不值得提倡的 。
当t_emp 表中数据多于 t_dept 表中的数据时,这时我们使用IN 优于 EXISTS 。当t_dept 表中数据多于 t_emp 表中的数据时(我们这里只是假设),这时我们使用EXISTS 优于 IN 。因此是使用IN 还是使用EXISTS 就需要根据我们的需求决定了 。但是如果两张表中的数据量差不多时那么是使用IN 还是使用 EXISTS 差别不大 。


推荐阅读