MySql语法(5)—in和join的区别

1. Join语法

实例表表A和表B.png
  1. 内连接:只返回满足条件的数据

INNER JOIN语法:

select * from A INNER JOIN B ON A.A1=B.B1

返回的数据是:

image.png
  1. 外连接:外连接又分为左外连接和右外连接,选择某个表为基表,基表数据全显示。

左外连接语法

select * from A LEFT JOIN B ON A.A1=B.B1;

上面的语句最终得到的连接顺序:AB,然后以左表为基表。只返回满足左表的数据,若右表无数据,那么返回null。

左外连接.png

右外连接语法:

select * from A RIGHT JOIN B ON A.A1=B.B1;

上面的语句最终得到的连接顺序:AB,然后以右边为基表。值返回满足右边的数据,若左边无数据,那么返回null。

右外连接.png

规范:不推荐使用复杂的多表查询

阿里巴巴开发手册.png

在《高性能mysql第三版》第6.3章查询性能优化中是这样描述的:根据实际情况,看看是否有必要将一个复杂的查询分解成多个简单的查询,并不一定将所有的工作全部交给数据库(Join拆解的核心就是利用In关键字)。

mysql连接和断开都是很轻量级,返回一个小的查询结果方面很高效。所以运行多个小查询不是存在性能瓶颈,数据库的优化器性能比较差,涉及到多个表的查询,往往得不到很好的查询计划。

而将join拆分为多个单表连接优点:

  • 利于缓存:应用系统可以方便的缓存单笔查询对应的结果;
  • 减少竞争:将查询分解后,执行单个查询可以减少锁的竞争;
  • 易于扩展:更加容易对数据库进行拆分;
  • 性能提升:使用in()来代替关联查询,可以让mysql按照ID顺序进行查询,这可能比随机的关联查询更加高效;
  • 减少冗余:在应用层做关联查询,意味着某些记录应用只需要查询一次,而在数据库中做关联查询,则可能需要重复地访问一部分数据。

在很多场景下,通过重构查询将关联放到应用程序中将会更加高效,这样的场景有很多,比如:当应用能够方便的缓存当个查询的结果的时候、当可以将数据分布到不同的mysql服务器上的时候、当能够使用IN()的方式代替关联查询的时候、当查询中使用的是同一个数据表的时候。

join和in的区别

  • 当in的范围条件少时,外表也会走索引,in的效率是高的。
  • 当in范围条件比较多时:

先全表扫描外表,将外表的每一条记录传递给内表,内表通过索引来判断是否满足,若满足则返回值。

当相同的select结果下,in的效率会比join效率低。因为in子查询每次执行内部查询的时候都必须重新构造一个JOIN结构,并且还需要完成析构过程。

历史文章

mybatis&&数据库优化&&缓存目录

JAVA && Spring && SpringBoot2.x — 学习目录

文章参考

解析SQL中内连接、外连接、完全连接、笛卡尔积关系

阿里规定超过三张表禁止join,为啥?

mysql子查询(in)的实现

你可能感兴趣的:(MySql语法(5)—in和join的区别)