主页 > 知识库 > SQL语句优化之JOIN和LEFT JOIN 和 RIGHT JOIN语句的优化

SQL语句优化之JOIN和LEFT JOIN 和 RIGHT JOIN语句的优化

热门标签:南昌呼叫中心外呼系统哪家好 泗洪正规电话机器人找哪家 怎么去开发一个电销机器人 ai电话电话机器人 小程序智能电话机器人 河北便宜电销机器人软件 湖南保险智能外呼系统产品介绍 简单的智能语音电销机器人 怎么申请400热线电话

在数据库的应用中,我们经常需要对数据库进行多表查询,然而当数据量非常大时多表查询会对执行效率产生非常大的影响,因此我们在使用JOIN和LEFT JOIN 和 RIGHT JOIN语句时要特别注意;

SQL语句的join原理:

数据库中的join操作,实际上是对一个表和另一个表的关联,而很多错误理解为,先把这两个表来一个迪卡尔积,然后扔到内存,用where和having条件来慢慢筛选,其实数据库没那么笨的,那样会占用大量的内存,而且效率不高,比如,我们只需要的一个表的一些行和另一个表的一些行,如果全表都做迪卡尔积,这开销也太大了,真正的做法是,根据在每一个表上的条件,遍历一个表的同时,遍历其他表,找到满足最后的条件后,就发送到客户端,直到最后的数据全部查完,叫做嵌套循环查询。

1、LEFT JOIN 和 RIGHT JOIN优化

在MySQL中,实现如 A LEFT JOIN B join_condition 如下:

1、表B依赖赖与表A及所有A依赖的表

2、表A依赖于所有的表,除了LEFT JOIN 的表(B)

3、join_condition决定了怎样来读取表B,where条件对B是没有用的

4、标准的where会和LEFT JOIN联合优化

5、如果在A中的一行满足where和having条件,B中没有,会被填充null

RIGHT JOIN 与LEFT JOIN类似,这个位置是可以互换的

LEFT JOIN 与 正常JOIN之间的转换原则上当where条件,对于生成的null行总返回false时,可以直接转化为正常的join

如:

SELECT * FROM t1 LEFT JOIN t2 ON (column1) WHERE t2.column2=5;

将被转换为:

SELECT * FROM t1, t2 WHERE t2.column2=5 AND t1.column1=t2.column1;

注:因为设置了条件t2.column2 =  5,那么对于所有的生成的t2为null的行都是不成立的

这样的优化将非常快速,因为这样相当于把外连接转换为等值连接,少了很多行的扫描和判断。

嵌套循环JOIN算法----Nested-Loop Join

简单的嵌套循环算法就是从一个表开始,通过对表的条件找到一行,然后找下一个表的数据,找完后,又回到第一个表来寻找满足条件的行

例如,有三个表t1, t2, t3,他们的join类型为:

Table  Join Type
t1   range
t2   ref
t3   ALL

最终生成的伪代码为

for each row in t1 matching range { 
 for each row in t2 matching reference key { 
  for each row in t3 { 
   if row satisfies join conditions, 
     send to client 
  } 
 } 
} 

即,t1表通过范围扫描,t2关联t1,t3为全表扫描

注:先根据对t1表的条件范围找到一行,和t2匹配,然后寻找t3的满足条件的行

块嵌套循环JOIN算法 ---- Block Nested-Loop Join

这个算法的应用为:由于之前的嵌套算法每读一个表的一行后,就会读下表,这样内部的表会被读很多次,所以,数据库利用了join缓存(join buffer)来存储中间的结果,然后读取内部表的时候,找到一行,都和这个缓存中的数据比较,以此来提高效率。例如:一次从外表读10行,然后读内部表时,都和这10行数据进行比较。

MySQL使用join buffer的条件为:

1、join_buffer_size系统变量决定了每个join使用的buffer大小

2、join类型为index或all时,join buffer才能被使用

3、每一个join都会分配一个join buffer,即一个sql可能使用多个join buffer

4、join buffer 不会分配给第一个非常量表

5、只有需要引用的列会被放到join buffer中,不是整行

最终生成伪代码为:

for each row in t1 matching range { 
 for each row in t2 matching reference key { 
  store used columns from t1, t2 in join buffer 
    这里将t1和t2使用的列存到join buffer中 
    if buffer is full { 
   for each row in t3 { 
    for each t1, t2 combination in join buffer { 
     if row satisfies join conditions, 
     send to client 
    } 
   } 
   empty buffer 
  } 
 } 
} 
 
if buffer is not empty { 
 for each row in t3 { 
  for each t1, t2 combination in join buffer { 
   if row satisfies join conditions, 
   send to client 
  } 
 } 
} 

注:在第二个循环才把数据存在join buffer中,这正好印证了上面的第4点

您可能感兴趣的文章:
  • 分析MySQL中优化distinct的技巧
  • mysql in语句子查询效率慢的优化技巧示例
  • MySQL查询优化:连接查询排序limit(join、order by、limit语句)介绍
  • MySQL优化之使用连接(join)代替子查询
  • SQL优化之针对count、表的连接顺序、条件顺序、in及exist的优化
  • MySQL中对于not in和minus使用的优化
  • 关于mysql中innodb的count优化问题分享
  • MySQL中insert语句的使用与优化教程
  • SQL优化教程之in与range查询

标签:泸州 景德镇 江苏 威海 淮安 荆门 那曲 柳州

巨人网络通讯声明:本文标题《SQL语句优化之JOIN和LEFT JOIN 和 RIGHT JOIN语句的优化》,本文关键词  SQL,语句,优化,之,JOIN,和,;如发现本文内容存在版权问题,烦请提供相关信息告之我们,我们将及时沟通与处理。本站内容系统采集于网络,涉及言论、版权与本站无关。
  • 相关文章
  • 下面列出与本文章《SQL语句优化之JOIN和LEFT JOIN 和 RIGHT JOIN语句的优化》相关的同类信息!
  • 本页收集关于SQL语句优化之JOIN和LEFT JOIN 和 RIGHT JOIN语句的优化的相关信息资讯供网民参考!
  • 推荐文章