一条 SQL 的执行过程

189 阅读2分钟

image.png 上图中的查询缓存在 MySQL 8.0 已经被移除了,因为大部分时候命中率太低了,而且还要为此维护一个查询缓存

1. 连接器

  1. 客户端通过连接器连上 MySQL 的服务端,连接器会进行权限验证以及对所建立的连接进行管理,例如查看用户名密码是否正确,以及该用户的权限,连接成功后,如果太长时间没有交互,连接器就会自动断开此链接,这个时间由 wait_timeout 控制,默认 8 小时
  2. 数据库中长连接是指连接成功后如果客户端持续有请求则一直使用同一个连接,短连接则是指每次执行完几次查询后就断开连接,下次查询在重新建立一个
  3. 只用长连接如果大部分连接 sleep 利用不频繁的话,而且长连接累计的内存会越堆越多,例如一个大的查询可能在连接断开前占用大量内存,过于浪费资源,只用短连接频繁建立连接也浪费资源,两者平衡,适用不同环境

适用场景:

1、在频繁的与数据库服务通信,并且又非高并发的情况下,使用长连接更合适;
2、太多持久连接,大部分是sleep状态的,或者系统是高并发的,使用短连接更合适。

解决方案:

1、定期断开长连接。使用一段时间,或者程序里面判断执行过一个占用内存的大查询后,断开连接,之后要查询再重连。
2、可以在每次执行一个比较大的操作后,通过执行mysql_reset_connection来重新初始化连接资源。这个过程不需要重连和重新做权限验证,但是会将连接恢复到刚刚创建完时的状态。

2. 分析器

词法分析: 识别 SQL 语句中各个字符串代表什么

语法分析:根据语法规则查看是否有语法错误

分析器使得 MySQL 知道你要做什么

3. 优化器

在知道你的需求后,达到目的的手段(也就是执行逻辑,例如多个索引用哪个更快,多表查询选择查询顺序等等)有多种,选择不同,执行效率也就不同,优化器会选择一个他认为比较快的一个执行逻辑

4. 执行器

分析器得到你的需求,优化器选择了达成目的的方案,最后执行器开始执行语句

  1. 开始执行时会先判断你是否有对这个标的权限,如果没有,返回权限错误
  2. 执行器会根据当前表的引擎定义,选择这个引擎的接口
  3. 将结果集返回客户端