简述
一条sql的执行流程,本质上就是客户端与服务器建立连接,然后客户端把sql(文本)发送给服务器进行执行,服务器在得出结果之后发回给客户端的过程。
服务器架构
本质上,MySQL服务可以分成server层和存储引擎两个部分,为了方便理解,在server层和存储引擎之间我们可以认为有一个API层,专门给server层提供操作数据的接口并屏蔽存储引擎的底层实现。
- server层:用来处理连接,优化sql,解析sql等操作。
- 存储引擎:规定了存储数据的底层结构,并提供数据的操作方法等。
server层各个组件的作用
连接器
用来处理客户端的连接请求,并对客户端身份进行验证。MySQL在有客户端连接之后,会新建一个线程,该线程负责处理客户端,客户端断开之后,线程不会销毁,而是会存放起来等待下一个客户端连接。
因此,如果客户端连接数量太多,那么线程服务器开启的线程就会增多,会影响性能,所以MySQL有最大连接数限制,默认是151。其实应该还有一个预备线程,专门留给超级用户的。
查询缓存
当用户执行查询时,首先会来查询是否存在缓存,如果缓存命中,就可以直接返回结果,不用继续往下执行了。
MySQL的缓存有一些比较坑的地方:
- 查询语句必须一模一样,才能命中缓存,多个空格都不行。
- 表数据更新时,关联的缓存全部失效。
- 查询操作执行前后都要去操作缓存,消耗性能。
因此在MySQL 8.0的时候,缓存已经被移除了。
解析器
解析sql的意图(select、insert等)以及校验语法是否正确。
优化器
生成一个执行计划,我们可以通过EXPLAIN查看该执行计划,主要对sql进行优化,形成最优的处理,比如多个索引的时候该如何选择索引,多表查询的时候如何选择关联顺序等。
执行器
负责调用接口并获取sql的执行结果。