MYSQL---执行流程

经过本文,咱们将了解到如下几个问题。mysql

1、思考

问题一:一条SQL语句在MYSQL中是如何执行的?sql

问题二:MYSQL是如何作到同时处理多个请求的?缓存

2、分析

备注:本文主要参考《极客时间:MySql实战45讲》服务器

  • MySQL执行流程图

  • 各模块做用

1.链接器多线程

  • 客户端链接MySql服务器命令

mysql -h(IP地址)  -P(端口号) -u(用户名)-p 优化

  • 链接器的做用

1.负责与客户端创建TCP链接。线程

2.链接创建以后,验证用户名密码。blog

3.查询权限表,验证权限(当链接创建以后,即便使用管理员帐号修改了此帐号密码,依然不影响此链接内的操做,除非从新再次创建链接)。索引

  • 空闲链接

创建链接以后,若是没有后续操做,则该链接处于空闲状态。经过SHOW PROCESSLIST命令能够查看空闲链接(Command:Sleep):接口

若是客户端太长时间没有动做,则链接器将会断开此链接。可经过如下命令查看默认等待时间(8小时):

  • 短链接

每次执行完不多几回查询就断开链接,下次查询从新创建一个链接。创建链接的过程比较复杂,建议使用长链接。

  • 长链接

若是客户端持续请求,则一直使用同一个链接。当使用大量长链接时会使MYSQL内存增加特别快。能够经过按期断开长链接或者msyql_reset_connection命令从新建立链接。

2.查询缓存 

  • 缓存存储形式

key:SQL语句  value:结果,若是缓存命中返回,不然执行后续流程。

  • 缓存参数

1.经过参数“query_chae_type”,控制是否开启缓存

2.在SQL语句中控制是否使用缓存

SELECT SQL_CACHE * FROM   t  WHERE id='1';

对于常常动态更新的表查询缓存的效率会变的很是低,而对于不须要变更的静态表可使用缓存。

在MYSQL8.0以后已经完全移除缓存,若是须要缓存可使用Redis。

 3.分析器

  • 词法分析

提取Mysql关键词,判断是增删查改的哪种。

  • 语法分析

判断SQL语句是否符合Mysql语法规则。

4.优化器

 优化器做用:

1.当表中有多个索引时,选择使用哪个索引。

2.多表关联查询时,决定各个表的链接顺序。

5.执行器

 1.判断对表T是否有执行权限。

2.若是有权限,打开表。根据表的存储引擎定义去调用对应存储引擎的接口。

 3、回答开篇

问题一:一条SQL语句在MYSQL中是如何执行的?

经过上文分析,咱们已经了解到了MYSQL的基本执行流程,并分析了各个部分的做用。

问题二:MYSQL是如何作到同时处理多个请求的?

MYSQL链接管理器是多线程处理模式,每个链接请求过来会建立一个线程进行处理。固然能够经过参数设置线程缓存数量(默认为0),这样一个新的请求会判断线程缓存中是否有可用线程,这样能够避免大量的线程建立和销毁带来的开销。具体请看:https://zhuanlan.zhihu.com/p/43941022