MySQL处理一次请求的大概流程

573 阅读2分钟

MySQL服务器如何处理客户端的请求

大概流程:
image.png
从图片上可以看出来一次请求的处理共分为三个阶段,分别是:处理连接、解析与优化、请求执行与返回。

处理连接:

每当有客户端请求到来时,服务器进程都会使用一个线程来处理与客户端的交互,当处理完客户端的请求后,服务器并不会立马销毁这个线程,而是缓存起来,等下一次客户端请求到来时进行复用。

解析与优化:

解析优化共分为三个部分,分别是:查询缓存,语法解析,查询优化。

  • 查询缓存:查询缓存是MySQL的查询优化手段,即MySQL会对查询请求的结果做缓存处理,该缓存可以在不同的客户端之间共享。如果有相同的请求访问时,会直接返回缓存结果。查看MySQL是否开启查询缓存的语句是:show variables like '%query_cache%';
  • 语法解析:当请求没有命中缓存时,就会走到语法解析阶段。用一句来描述语法解析阶段就是:从指定的文本中获取查询条件。语法解析阶段实际上也是一个编译的过程,涉及到词法解析、语义解析等。
  • 查询优化:该阶段主要是根于查询条件生成执行计划,该计划包括了使用哪些索引、表的连接顺序等。

请求执行与返回:

其实直到查询优化阶段,还是没有真正执行SQL语句。真正执行请求、获取数据的阶段是在存储引擎里完成的。存储引擎实质上就是一张表,由一行行的记录组成,对外提供API用于执行请求。大家习惯将处理连接请求、解析优化这些工作归类到MySQL Server,MySQL Server拿着最终生成的执行计划,调取存储引擎的API来存取数据,完成一次请求。

Q&A

  • 在“连接处理”环节,所提到的“线程”是否指的就是连接池中的线程?如果是的话,那是不是说一个客户端只可能拥有一个“连接”?如果不是的话,连接池中的“连接”到底指的是什么呢?