mysql的join用法(一)

175 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第11天,点击查看活动详情

写了两年的规则,对mysql的一些语法渐渐生疏了,经常写sql都不敢写了,追根到底还是联表查询不熟,今天加深下印象;

首先要理解个事,就是我们使用了join就代表我们要联表,联表就得考虑如何减少查询的次数,通常我们听到最多的就是小表驱动大表(大部分情况)的说法,另外我们也得注意表在左边或者右边会影响我们的最终查询结果(后面细说);还有我们查询通常会后面跟on连接条件,这个条件只是一个匹配的条件,但是在查询的时候默认还是查全表,然后将查出来的数据再根据on来匹配(where条件另看);

在看join用法的时候得先知道join的工作原理;结合网上资料,发现join有两类算法结构,

  • 如果你有索引,就用Index Nested-Loop Join(索引嵌套循环),大概意思就是先查出外层表数据,然后直接通过索引与内层表索引匹配查询(按页为单位,每页存储的索引特多,会节省I/O读取判断);

  • 如果没有索引,就用Block Nested-Loop Join(缓存嵌套循环),大概意思是会缓存外层表的查询数据(不是外层一条一条和内层数据匹配查询),然后内层表每行数据会和缓存的外层数据统一比较,简单画个图就是

    我们查看join buffer的大小可通过Show variables like 'join_buffer_size%';

  • 这里我们再稍微了解下Batched Key Access join,它是集上面两个算法外加MRR(乱序I/O变按顺序I/O,可去官网看看),大概就是前面的表查询结果放入join buffer,然后这些值对应的索引发送到MRR,MRR获取到数据key后,对其进行排序,然后再去匹配内表(这里不过多详解,点到为止)

以上就是join的大概概念了,看到这我们应该大概清楚,不论何时我们都不要select * 去查询,在联表查询的时候可能取主外键就够用了,也就不需要回表了,但是你只要加了某些字段,就可能需要回表,甚至sql的优化器可能会改变我们的sql逻辑,按照他理解的最优算法去优化查询;

基础概念我们已经看完了,现在我这里新建两张表, a表b表

下一节根据这两张表进行join的具体操作,好啦🥗🥗🥗;

结束结束,那就🛴🛴🛴