从宏观的角度去看mysql的大体架构的话可以看出是分为两层,一个是server层另一个是存储引擎层。
server:
-
连接器:负责管理连接的管理客户端与服务端的连接。进行验证、获取账号权限等。mysql使用的是tcp协议进行传输数据的。所以会存在长时间如果不用连接会出现资源浪费的情况,所以肯定是可以设置空闲时间,如果是超过空闲时间将会断开,释放资源等等。其实连接器主要还是负责与外部建立了连接。(ps:就像你要进我家门,我要知道你是谁,我才会开门让你放行,当然也有驱逐你的权利。可以这么理解)。
-
缓存查询:这个就比较好理解一些,就像我们的业务进行查询数据的时候,如果缓存中有那就在缓存中取(以key-value形式存储。key为sql,value为值),没有就往下继续找。但是会有一些问题,如果数据更新比较频繁的话,那缓存就没用了,感觉没啥必要。
-
解析器:
- 词法分析:根据你输入的sql语句根据及解析器识别出关键字
- 语法分析:会根据语法解析器的规则去分析当前sql的语法是否正确(比如from和form)如果语法报错就直接报错了。
-
sql执行流程(开始执行sql)
- 预处理器:检查当前sql的表、字段是否存在。将select * 扩展到所有表。进行预处理(prepare)阶段
- 优化器:这里就是要进行当前sql要使用哪种方案进行执行,就是根据计算成本(查询成本)来决定使用哪个索引。
- 执行器:确定好查询方案之后,然后执行sql,与存储引擎进行交互。
存储引擎层:
这里负责的是数据(读取与写入)存储方面的后续详细讲讲。
总结:
我的理解为:从宏观的角度去看mysql的整体架构。首先是server层开始。首先是连接器,主要负责管理连接,验证,鉴权。然后看当前sql如果是查询将会先走到缓存这里进行获取数据(mysql8.0已经没有缓存了)。在到解析器这里,先进行词法分析,识别出关键字,然后进行语法分析,判断当前是否出现语法错误生成语法树。最后到sql执行阶段,预处理器:会先进行sql判断当前表字段是否存在,然后将sql完全展开;以上都没有问题之后将会走到优化器,这里优化器会根据计算成本去选用合适的执行方案,就是会去选择成本较低的索引作为执行方案;执行器:这里就是执行sql,根据优化器提供的方案执行sql与引擎交互,调用存储引擎接口获取数据。最后到存储引擎层,这里主要负责数据的读取和写入。