我们要回答这个问题,我们就要首先要清楚mysql的逻辑架构。mysql逻辑架构主要分为三层。第一层是连接层,第二层是服务层,第三层是引擎层。
- 连接层
- tcp连接池,线程池
- 服务层
- sql接口:SQL接口专门用来接收sql,并返回查询结果
- 解析器:对sql进行词法和语法的解析,解析成功将生成一棵语法树,此时mysql就知道这条sql是干什么的了
- 优化器:优化器会选择一个最佳的执行计划。
- 查询缓存区:以sql为k,查询结果为v存储
- 引擎层
- InnoDB,MyISAM,Memory等:与底层文件系统进行交互。
我们了解了mysql内部的整体结构。我们就来说下一条sql执行的大致流程。
当客户端与mysql服务端建立连接后,客户端就可以发送sql了。首先会在连接层检查是否有缓存,如果有,那么就不进行后续操作,直接返回结果了。如果没有,接下来就由第二层服务层来处理sql,SQL接口接收sql,然后解析器对sql进行词法和语法的解析,解析成功将生成一棵语法树,此时mysql就知道这条sql是干什么的了。但这时候并不会直接去执行。还有一个核心组件,优化器。优化器会选择一个最佳的执行计划。优化器会将执行计划交给执行引擎。最终由执行引擎调用存储引擎的API。最后存储引擎与底层的文件系统进行交互。然后返回结果,也将该结果缓存到缓存区中。
