MySQL实战45讲(From 极客时间)学习笔记(1)
01 | 基础架构:一条SQL查询语句是如何执行的?
本节课内容其实较为简单,最主要的是想为学习者建立一个流程图的概念,即一条sql查询语句执行时的整个流程。
大体上,mysql的整体架构可分为Server层和存储引擎层。Server层主要包括:连接器、查询缓存、分析器、优化器和执行器以及各种内置函数。存储引擎层则包括:各种底层的存储引擎(如innodb)。
连接器
用户使用客户端登录mysql时,通过连接器与mysql进行连接。连接器负责跟客户端建立连接、获取权限、维持和管理连接。当客户端连接上后在wait_timeout的时间内没有任何反应,则会自动断开连接,一般默认值为8小时。
数据库里面,长连接是指连接成功后,如果客户端持续有请求,则一直使用同一个连接。短连接则是指每次执行完很少的几次查询就断开连接,下次查询再重新建立一个。建立连接时尽量使用长连接。但长连接常常伴随较大的内存占用。
解决方案有:1、定期断开连接。即使用一段时间后,断开连接再重新连接。2、当执行完一个占内存较大的查询操作后,重新建立一次连接。
查询缓存
个人认为查询缓存与cache原理相仿,我把基于的原理概括为查询局部性。利用查询局部性,把一些查询语句存放于查询缓存中。当执行查询语句时,首先判断是否命中查询缓存中的语句。但使用查询语句的弊大于利:1、判断时需要语句完全对应相同,才判断命中,因此其判断的过程成本总是较高的。2、每当某表单被更新后,查询缓存中的相关语句将会被清空,使得查询的命中率会较低。而自mysql 8.0后,这个功能也被完全取消了。
分析器
分析器主要完成的是词法分析和语法分析的工作。词法分析完成的是判断该语句实际表达的任务是什么。语法分析负责的是判断该语句的语法是否符合SQL语句的语法规则。
优化器
优化器负责的是根据分析器得出的任务确定具体的执行方案。由于每个执行方案虽然得到结果相同,但执行效率却不尽相同。同时在表里存在多个索引时,优化器还需要决定选择哪个索引进行查询。
执行器
经过上述的各个阶段后,终于到了执行器的工作。顾名思义,执行器的任务就是根据优化器得到的执行方案进行执行操作。首先需要判断该用户是否有查询操作的权限,然后再在表单里进行查询并返回结果。