一、MySQL 的基本架构信息
MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数据和加密函数等),所有跨存储引擎的功能都在这一层实现,不同的存储引擎共用一个service 层。
二、连接器
服务端建立连接,在完成经典的TCP握手后,连接器就要开始认证你的身份。客户端如果太长时间没动静,连接器就会自动将它断开,默认值是8小时。
可以通过show processlist;命令查看连接的信息。
长连接:指连接成功后,如果客户端持续有请求,则一直使用同一个连接。
短连接:指每次执行完很少的几次查询就断开连接,下次查询再重新建立一个。
三、查询缓存
MySQL拿到一个查询请求后,会先到查询缓存看看,之前是不是执行过这条语句。之前执行过的语句及其结果可能会以key-value对的形式,被直接缓存在内存中。key是查询的语句,value是查询的结果。
只要有对一个表的更新,这个表上所有的查询缓存都会被清空。除非业务就是有一张静态表,很长时间才会更新一次。比如,一个系统配置表,那这张表上的查询才适合使用查询缓存。
MySQL 8.0版本直接将查询缓存的整块功能删掉了。
四、分析器
- 词法分析:根据关键字识别你输入的字符串分别是什么,代表什么。
- 语法分析:分析器会根据语法规则,判断你输入的这个SQL语句是否满足MySQL语法。
五、优化器
比如分析器会根据语法规则,判断你输入的这个SQL语句是否满足MySQL语法。分析器会根据语法规则,判断你输入的这个SQL语句是否满足MySQL语法。
优化器是怎么选择索引的?
六、执行器
- 先判断一下你对这个表有没有执行查询的权限。
- 执行器就会根据表的引擎定义,去使用这个引擎提供的接口。
- 执行器的执行流程是这样的:
3.1 无索引
调用InnoDB引擎接口取这个表的第一行,判断是否满足条件,满足则将这行存在结果集中;
调用引擎接口取“下一行”执行相同的逻辑,直到最后一行。
执行器将上述遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户端。
3.2 无索引
执行的逻辑也差不多,第一次调用的是“取满足条件的第一行”这个接口,之后循环取“满足条件的下一行”这个接口,这些接口都是引擎中已经定义好的。
执行器调用一次,在引擎内部可能存在扫描了多行,