01.一条SQL语句在执行时,其底层经历了哪些过程?

一条SQL语句在执行时,其底层经历了哪些过程?
大致来说,MySQL 能够分为 Server 层和存储引擎层两部分(固然,首先还得通过客户端)
多个存储引擎共用一个server层 所以全部跨存储引擎的功能都在这一层实现,好比存储过程、触发器、视图等mysql

clipboard.png

建表时若是不指定存储引擎则默认使用的是InnoDB存储引擎(MySQL5.5.5版本之前默认使用的是MyISAM引擎 TODO:两者区别后续讲解)sql

链接器
一条SQL语句从客户端传过来首先会建立一个链接,用username和password认证身份
链接完成后若是没有其余操做便处于空闲状态 默认8h自动断开空闲链接
链接还分为长链接和短链接
长链接:持续使用同一个链接处理请求
短链接:一个链接仅执行几回后便断开,而后从新创建链接
由于建立链接的过程比较复杂,因此建议尽可能使用长链接
可是长链接太多有时候MySQL占用内存涨的特别快,此时能够考虑如下两种方案:
1.按期断开长链接或者执行一个占用内存大的查询后断开链接从新链接后继续下面的查询
2.MySQL5.7以上版本能够使用mysql_reset_connection命令来初始化链接资源,此操做不须要重连以及登陆验证,就能够将链接恢复到刚刚建立完的状态缓存

查询缓存
创建链接后先去查询缓存
可是你们基本不用mysql的缓存功能
由于只要有对该表数据更新,表上的全部缓存都会清空而后从新建立缓存
因此通常默认不查缓存 但能够使用select SQL_CACHE * from T where ID = 1按需查询
PS.MySQL8.0直接将查询缓存功能删掉了优化

分析器
通过缓存器后来到分析器
先作词法分析 分析出sql语句中的关键字
而后作语法分析 判断是否有语法错误spa

优化器
通过分析后MySQL知道你要作什么了,可是在实际执行以前还得通过优化器优化一下
在表中有多个索引的时候,由优化器来决定使用哪一个索引
或者有多表关联(join)的时候决定链接顺序 选择效率高的方案
TODO:MySQL根据什么选择索引呢?后续解答server

执行器
执行器开始执行以前会验证是否有读/写权限 没有则返回权限错误
有的话就打开表调用指定的存储引擎接口获取执行结果集 返回给客户端
TODO:存储引擎内部机制后续讲解索引

相关文章
相关标签/搜索