MySQL的底层机制
MySQL大致可以分为Service层和引擎层。
目录
Service层
它包括连接器、查询缓存、分析器、优化器、执行器。它涵盖了MySQL的大多数核心服务功能和所有的内置函数,所有跨存储引擎的功能都在这里实现。
连接器
负责跟客户端建立连接、获取权限、维持或者管理连接。当我们连接到这个数据库的时,我们就会遇到连接器。这里的连接就是TCP的握手后开始认证身份。认证完成后,连接器就会在权限表里查找你的权限,也就是说在连接成功后还没有断开的时候,管理员如果修改了它的权限也不会立即生效等到了下次连接成功后才会生效。
MySQL的连接也有长连接与短连接之分,
长连接:连接成功后,如果客户端持续有请求就一直用一个连接
短连接:执行很少的几次查询之后就会自动断开,下次查询的时候再重新创建一个。
因为建立连接的过程复杂且消耗资源,所以尽量使用长连接。但是,如果你全部使用长连接的时候,你可能会发现MySQL的占用内存涨的很快,那是因为MySQL在执行的过程中临时使用的内存是在连接对象里面的,这些资源只有等连接断开的时候才会被释放。所以这些长连接长期的累积可能会导致占用的内存过大,发生了OOM,MySQL异常重启。
所以我们一般可以定期的去断开长连接,然后再需要查询的时候再重连。
查询缓存
当MySQL拿到了一个查询请求的时候,它首先不会去在磁盘中查而是先去查找缓存,看看之前是不是执行过这条语句。因为之前执行的语句会以key-value的形式被缓存到内存中,key是语句,value是结果。如果能在内存中查到这个key,就会直接返回缓存中的执行结果。这样可以大大的提高了速率,这样看似很方便,但是有一个很让人头疼的地方。因为牵扯到缓存失效的问题,当你对一个表有过更新之后,所有的缓存就会失效然后被清除,这对一个更新频繁数据库来说是非常要命的。所以查询缓存一般就适用于更新很少甚至不更新的表。
分析器
如果没有命中缓存,就会去真正的执行这条语句。所以,要对这条语句进行词法分析与语法分析。
词法分析就是MySQL需要把你的SQL语句的每一个字符串都得识别出来,知道这些字符串代表着什么。
语法分析就是当词法分析通过后,再去根据语法规则来判断你这条语句是否合法,如果不合法就直接报错。
优化器
当这条语句通过分析器之后就到了优化的阶段,但这时候还并没有去执行这条语句,它在执行之前要进行优化处理。它就是在表中有多个索引的时候,决定使用哪个索引或者在一条语句关联了多张表的时候,各个表的连接顺序。因为有时候结果相同,但是效率不同,优化器就是尽量选择效率比较好的方式。
执行器
优化过后就可以正式的执行了,这时候先要去判断权限,如果没权限会直接报错。如果有权限就继续执行,这时候执行器就会根据引擎的定义来使用这个引擎的接口。
存储引擎层
它负责数据的存储与提取,我们常见的有InnoDB、MyISAM等