逻辑架构图
一条sql语句是如何在mysql的各个功能模块中执行的?
连接器
连接器负责跟客户端建立连接,获取权限,维持和管理连接。
步骤:
- 验证用户名和密码
- 根据用户名和密码认证当前连接所拥有的权限
- 连接完成后,若没有后续动作则连接处于空闲状态。
查询缓存
连接建立完成就可以执行sql语句了,此时会先查询缓存,看之前是否执行过这条sql, 之前执行过的sql和结果会以key,value的形式被直接缓存在内存中,key是查询语句,value是查询结果。如果可以命中缓存,将大幅提高查询效率。
但大多数情况下,不建议使用查询缓存,mysql8.0也将查询缓存的功能删掉了。原因是查询缓存的弊大于利,查询缓存的失效十分频繁,只要有对一个表的更新。这个表所有的查询缓存都会被清空,因此当我们费时的将缓存结果存起来,还没来得及使用时就已经被清空掉了。
所以,对于更新压力大的数据库来说,查询缓存命中率会非常低。
分析器
分析器对sql语句做解析,会做词法分析和语法分析,判断表是否存在,列是否存在,sql语句是否正确。如果你的sql语句不对,就会收到错误提示:
ERROR 1064 (42000): You have an error in your SQL syntax;
优化器
经过分析器,mysql知道你要做什么,但是在执行sql之前,需要经过优化器来决定怎么做。
比如我们建了多个索引时,优化器会决定使用哪个索引;有多表关联时,优化器来决定各个表的连接顺序,执行器会去选择方案已达到最优的效率。
执行器
优化器阶段完成之后,sql语句的执行方案就已确定了,然后进入执行器阶段。执行器会根据执行方案来执行语句,先验证权限然后打开表,根据表的引擎定义去使用该引擎提供的接口,最后将处理sql得到的结果集返回给客户端。
mysql机读顺序