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

【阿里数据库开发规范解释:关联查询,为什么要建议小表驱动大表?】有的时候我们在操作数据库时会将两个或多个数据表关联起来通过一些条件筛选数据,在关联表时我们要遵循一些原则,这样会使我们编写的SQL 语句在效率上快很多 。
一、优化原则小表驱动大表,即小的数据集驱动大得数据集 。在知道什么是小表驱动达大表之前,我们先来了解两个查询关键字,IN 与 EXISTS 。我们通过两段查询语句先来了解一下它们的作用 。我建立了两张表,一张员工表,一张部门表,员工表中有部门id 这个属性,将这两张表关联起来 。
我们先使用IN 来查询数据:
SELECT * FROM t_emp WHERE dept_id IN (SELECT dept_id FROM t_dept) LIMIT 5;查询结果:由于有很多的员工信息,在这里我就只查询5 条数据 。
+-------------+----------+------------+--------------+---------+| emp_id      | emp_name | emp_gender | emp_email    | dept_id |+-------------+----------+------------+--------------+---------+| 00000000177 | 41d80    | m          | 41d80@zc.com |       1 || 00000000178 | a74b8    | m          | a74b8@zc.com |       1 || 00000000179 | 661ca    | m          | 661ca@zc.com |       1 || 00000000180 | 9413d    | m          | 9413d@zc.com |       1 || 00000000181 | 7d577    | m          | 7d577@zc.com |       1 |+-------------+----------+------------+--------------+---------+接下里使用EXISTS 来查询数据:
 SELECT *  FROM t_emp  WHERE EXISTS      (SELECT 1      FROM t_dept      WHERE t_dept.dept_id = t_emp.dept_id)  LIMIT 5;查询结果:与上面的结果一样 。
+-------------+----------+------------+--------------+---------+| emp_id      | emp_name | emp_gender | emp_email    | dept_id |+-------------+----------+------------+--------------+---------+| 00000000177 | 41d80    | m          | 41d80@zc.com |       1 || 00000000178 | a74b8    | m          | a74b8@zc.com |       1 || 00000000179 | 661ca    | m          | 661ca@zc.com |       1 || 00000000180 | 9413d    | m          | 9413d@zc.com |       1 || 00000000181 | 7d577    | m          | 7d577@zc.com |       1 |+-------------+----------+------------+--------------+---------+既然IN 和 EXISTS 都可以用来查询数据,那它们两个有什么区别呢?
SELECT * FROM t_emp WHERE dept_id IN     (SELECT dept_id     FROM t_dept);// 这条SQL 语句相当于:for SELECT dept_id FROM t_dept    for SELECT * FROM t_emp WHERE t_emp.dept_id = t_dept.dept_id这里虽然我们编写的SQL 语句是主查询员工信息,子查询部门id ,但是MySQL 的执行顺序会先执行子查询,再执行主查询,然后获得我们要查询的数据 。
 SELECT *  FROM t_emp  WHERE EXISTS      (SELECT 1      FROM t_dept      WHERE t_dept.dept_id = t_emp.dept_id);// 这条SQL 语句相当于:     for SELECT * FROM t_emp     for SELECT * FROM t_dept  WHERE t_dept.dept_id = t_emp.dept_id          


推荐阅读