【阿里数据库开发规范解释:关联查询,为什么要建议小表驱动大表?】有的时候我们在操作数据库时会将两个或多个数据表关联起来通过一些条件筛选数据,在关联表时我们要遵循一些原则,这样会使我们编写的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
推荐阅读
- 分布式数据库调优实践
- 详解PostgreSQL数据库压测工具之pgbench-tools
- 5年Python功力,总结了10个开发技巧
- 阿里的垃圾怎么回收?Java G1源码分析与调优手册
- 用Python连接4个常用数据库的URL写法,你掌握了吗?
- 关于Oracle数据库12c 新特性总结
- 淘宝进货渠道除了阿里巴巴还有什么 淘宝的进货渠道
- 恩施州推进夏秋茶开发,宁波夏秋茶试制水平取得突破
- 什么是前端和后端开发?写给即将迈入前端开发领域的朋友
- 阿里云峰会 | 来听听达摩院技术专家是怎么讲智能外呼机器人技术
