「MySQL」 MySQL执行流程

MySQL知识梳理图,一图看完整篇文章: html

MySQL优化一直是老生常谈的问题,尤为在面试环节中,但在作MySQL的优化以前,得先了解MySQL的执行流程是怎样,这样才更好的去优化。web

面试过程当中也一般会问若是高并发或者用户反映系统太卡,咱们该怎么去优化?面试

  • 若是高并发,请求书过多,优先增长web服务器机器,作好负载均衡。
  • 若是请求静态页面不卡,可是动态数据卡,则说明MySQL处理的请求过多,须要再MySQL的上游封装一层缓存层,减轻MySQL的压力。
  • 数据库层实际上是很是脆弱的一层,通常在应用架构设计时,一般须要将一些用户非实时的数据或变化不频繁的数据缓存起来,让这些请求穿透不到DB,同时还能够引入队列作数据的异步更新。若是请求数激增,仍是有很是大的查询压力到MySQL,这时候则想办法解决MySQL的瓶颈。

1. 执行流程图

简易的流程图以下:数据库

大体流程描述:缓存

  • MySQL客户端经过协议将SQL语句发送给MySQL服务器。
  • 服务器会先检查查询缓存中是否有执行过这条SQL,若是命中缓存,则将结果返回,不然进入下一个环节(查询缓存默认不开启)。
  • 服务器端进行SQL解析,预处理,而后由查询优化器生成对应的执行计划。
  • 服务器根据查询优化器给出的执行计划,再调用存储引擎的API执行查询。
  • 将结果返回给客户端,若是开启查询缓存,则会备份一份到查询缓存中。

2. 流程图详解

2.1 查询缓存

MySQL查询缓存会保存查询返回的完整结构。当查询命中该缓存时,MySQL会马上返回结果,跳过了解析、优化和执行阶段。 但查询缓存是默认不开启的,且要求SQL和参数都是同样,同时查询缓存系统会跟踪查询中涉及的每个表,若是这些表发生变化,则该表相关的全部缓存数据均会失效。因此命中率通常较低,生产环境中也不多用到,具体流程就不描述了。若是感兴趣的能够查阅详细资料。服务器

2.2 解析和预处理

若是查询缓存未命中,则到解析器。解析器主要是对SQL语句进行解析,使用MySQLy语法规则进行验证和解析查询,并生成对应的解析树。 获得解析数以后,还须要作预处理,预处理则进一步检查解释树是否合法,以及进行一些优化,好比检查数据表和列是否存在,若是有计算,会将计算的结果算出来等等。架构

2.3 查询优化器

查询优化器是整个流程中重要的一环。查询优化器会将预处理以后的解析树转化成执行计划。一条查询能够有多种执行方法,最后均会返回相同结果。查询优化器的做用就是找到这其中最好的执行计划。   生成执行计划的过程会消耗较多的时间,特别是存在许多可选的执行计划时。若是在一条SQL语句执行的过程当中将该语句对应的最终执行计划进行缓存,当类似的语句再次被输入服务器时,就能够直接使用已缓存的执行计划,从而跳过SQL语句生成执行计划的整个过程,进而能够提升语句的执行速度。 一般所讲的优化SQL,其实就是想让查询优化器,按照咱们的思路,帮咱们选择最优的执行方案。并发

2.4 查询执行计划

查询执行计划,就是MySQL查询中的执行计划,好比是执行where语句仍是from语句,下面有一张执行顺序的图。负载均衡

最早执行的老是FROM操做,最后执行的是LIMIT操做。其中每个操做都会产生一张虚拟的表,这个虚拟的表做为一个处理的输入,只是这些虚拟的表对用户来讲是透明的,可是只有最后一个虚拟的表才会被做为结果返回。若是没有在语句中指定某一个子句,那么将会跳过相应的步骤。异步

  • FORM: 对FROM的左边的表和右边的表计算笛卡尔积。产生虚表VT1
  • ON: 对虚表VT1进行ON筛选,只有那些符合的行才会被记录在虚表VT2中。
  • JOIN: 若是指定了OUTER JOIN(好比left join、 right join),那么保留表中未匹配的行就会做为外部行添加到虚拟表VT2中,产生虚拟表VT3, 若是 from子句中包含两个以上的表的话,那么就会对上一个join链接产生的结果VT3和下一个表重复执行步骤1~3这三个步骤,一直处处理完全部的表为止。
  • WHERE: 对虚拟表VT3进行WHERE条件过滤。只有符合的记录才会被插入到虚拟表VT4中。
  • GROUP BY: 根据group by子句中的列,对VT4中的记录进行分组操做,产生VT5.
  • CUBE | ROLLUP: 对表VT5进行cube或者rollup操做,产生表VT6.
  • HAVING: 对虚拟表VT6应用having过滤,只有符合的记录才会被 插入到虚拟表VT7中。
  • SELECT: 执行select操做,选择指定的列,插入到虚拟表VT8中。
  • DISTINCT: 对VT8中的记录进行去重。产生虚拟表VT9.
  • ORDER BY: 将虚拟表VT9中的记录按照<order_by_list>进行排序操做,产生虚拟表VT10.
  • LIMIT:取出指定行的记录,产生虚拟表VT11, 并将结果返回。

2.5 查询执行引擎

执行计划会传给查询执行引擎,执行引擎选择存储引擎来执行计划,到磁盘中的文件中去查询。 影响这个查询性能最根本的缘由是什么? 实际上是硬盘的机械运动,也就是咱们平时熟悉的IO,因此一条查询语句是快仍是慢,就是根据这个时间的IO来肯定的。那怎么执行IO又是什么来肯定的?就是传过来的这一份执行计划.

更多文章请关注公众号 『天澄技术杂谈』

参考文章:

https://juejin.im/post/5b7036de6fb9a009c40997eb
  https://blog.csdn.net/I980663737/article/details/78421523
  https://www.cnblogs.com/rollenholt/p/3776923.html
复制代码