YFCEMBEDD 2019-07-01
一条SQL语句在执行时,其底层经历了哪些过程?
大体来讲,MySQL 可以分为 Server 层和存储引擎层两部分(当然,首先还得经过客户端)
多个存储引擎共用一个server层 因此所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等
建表时如果不指定存储引擎则默认使用的是InnoDB存储引擎(MySQL5.5.5版本以前默认使用的是MyISAM引擎 TODO:二者区别后续讲解)
连接器
一条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语句中的关键字
然后做语法分析 判断是否有语法错误
优化器
经过分析后MySQL知道你要做什么了,但是在实际执行之前还得经过优化器优化一下
在表中有多个索引的时候,由优化器来决定使用哪个索引
或者有多表关联(join)的时候决定连接顺序 选择效率高的方案
TODO:MySQL根据什么选择索引呢?后续解答
执行器
执行器开始执行之前会验证是否有读/写权限 没有则返回权限错误
有的话就打开表调用指定的存储引擎接口获取执行结果集 返回给客户端
TODO:存储引擎内部机制后续讲解