mysql优化器对sql语句的简化(条件简化、外连接消除、子查询优化)

mysql优化器对sql语句的简化(条件简化、外连接消除、子查询优化)

大多数的sql语句由人工写完后都可以转换成某种比较高效的执行形式,称为查询重写。本质上就是mysql优化器觉得你写的sql语句不好mysql sql语句优化总结,自己再重写一遍。那重写的规则是什么?

一、条件化简 1、移除不必要的括号

((a = 5 AND b = c) OR ((a > c) AND (c < 5)))

化简成: (a = 5 and b = c) OR (a > c AND c < 5)

2、常量传递

由and连接的表达式可以进行常量的传递,例如

a = 5

a = 5 AND b > a

简化成:a=5 and b>5

3、表达式计算(重点说明)

a=5+1

化简成a=6

重点说明:如果列出啊先再函数中:abs(a)>5或者-a

如上面这种优化器不会尝试对这些表达式进行化简,而这些列上如果建立了索引执行计划也不会走索引。这种情况的特点就是再列上进行了运算,如果不在列上运算(a=5+1),不会影响。

4、和where子句的合并

mysql sql语句优化总结

如果查询语句中没有出现sum、max等的聚合函数以及group by子句,优化器就会把子句和where子句合并。

5、常量表

查询的表中⼀条记录没有,或者只有⼀条记录。

使⽤主键等值匹配或者唯⼀⼆级索引列等值匹配作为搜索条件来查询某个表。

优化器觉得这两种查询花费的时间特别少mysql sql语句优化总结,少到可以忽略,所以也把通过这两种⽅式查询的表称之为常量表。

优化 器在分析⼀个查询语句时,先⾸先执⾏常量表查询,然后把查询中涉及到该表的条件全部替换成常数,最后再分析其余表的查询成本

* FROM INNER JOIN     ON . = .     WHERE . = 1;

优化成:

表记录的各个字段的常量值, .* FROM INNER JOIN     ON 表列的常量值 = .;

二、外连接消除

对于优化人员,我们知道:内连接的驱动表和被驱动表的位置可以相互转换,⽽左(外)连接和右(外)连接的驱动表和被驱动表是固定的。这就导致内连接优化器可以通过改变连接顺序来降低整体的查询成本,而外连接却无法优化连接顺序(驱动表不可改变)。

可能有些人不清楚内连接和外连接的区别:可以看我以前的文章详细介绍了连接的原理(待修改)-CSDN博客

外连接和内连接的本质区别就是:对于外连接的驱动表的记录来说,如果⽆法在被驱动表中找到匹配ON⼦句中的过滤条件的记录,那么该记 录仍然会被加⼊到结果集中,对应的被驱动表记录的各个字段使⽤NULL值填充;而内连接的驱动表的记录如果⽆法在被驱动表中找到匹配ON⼦句中的过滤条 件的记录,那么该记录会被舍弃

左连接

select * from lian left join score
on lian.id = score.id;

mysql sql语句优化总结

左连接执行计划

mysql sql语句优化总结

可以看到驱动表是lian表,该表由八万多条数据,而驱动表每一行都需要进行匹配mysql优化器对sql语句的简化(条件简化、外连接消除、子查询优化),所以如果两个表进行内连接score会作为驱动表,但是左外连接,lian表作为驱动表。

怎么才能将score表作为驱动表呢,或者说换一种思路,外连接在什么情况下能转换成驱动表呢?

左外连接与内连接的转化

select * from lian left join score
on lian.id = score.id where score.id is not null;

可以看到他和内连接结果是相同的。

再看看执行计划

mysql sql语句优化总结

可以看到驱动表为score。

结论

以上说明外连接在where条件中规定被驱动表不为空的时候(或者规定score.id=某值)可以转换为驱动表 。

思考:

而我也问了经验颇深的开发,他说在开发环境中左外连接用到的几率是最大的,场景如:被驱动表的记录不完整,所以需要左外连接,查询出为记录为空的被驱动表mysql sql语句优化总结mysql优化器对sql语句的简化(条件简化、外连接消除、子查询优化),进行信息填写,所以说实际情况下,大概率不会在where条件中进行被驱动表的规定。但是对于以上的转化,优化人员也要清楚。

公告:
1. 本站所有资源来源于用户上传和网络,如有侵权请联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系站长处理!
6. 本站不售卖代码,资源标价只是站长收集整理的辛苦费!如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
7. 站长QQ号码 2205675299

资源库 - 资源分享下载网 » mysql优化器对sql语句的简化(条件简化、外连接消除、子查询优化)

常见问题FAQ

关于资源售价和售后服务的说明?
本站所有资源的标价均为本站收集资源的辛苦费,不代表资源本身的价值。软件是高智慧高价值的商品,不可能是白菜价。本站资源标价只是赞助费用,收取的赞助费仅用来维持本站的日常运营!毕竟收集整理资料需要投入云计算资源和站长大量的精力。
代码有没有售后服务和技术支持?
由于代码的运行具有不可预见性,本站不保证代码完整可运行,不提供技术支持和售后服务。 本站原创代码都是站长自己开发的,可以有偿提供技术支持服务。 网站里标明【亲测】的代码都是站长亲测过的,其他的代码由于精力有限,没有一一测试,不能保证代码就一定能够使用,更没有技术支持服务,下载前请自行斟酌。
有没有搭建服务?
由于搭建服务比较费时费力,所以本站除了原创代码外均不提供搭建服务。本站分享代码纯属兴趣爱好,不以盈利为目的,请勿咨询有没有搭建服务,谢谢理解。
链接地址失效了怎么办?
请带上资源链接地址联系客服,工作时间内我们看到后将第一时间回复。
关于解压密码
本站资源一般都没有加密,如果发现需要解压密码的,那么就输入 hao.35dc.com 试试。

发表评论

资源库,由老程序员细心甄别、精心筛选,只为提供优质的源码资源

关于我们 联系我们