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

30次阅读

共计 856 个字符,预计需要花费 3 分钟才能阅读完成。

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

建表时如果不指定存储引擎则默认使用的是 InnoDB 存储引擎

连接器
一条 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: 存储引擎内部机制后续讲解

正文完
 0