1-mysql基础架构

MySQL 基础架构

  • 在MySQL中。一条语句是如何执行的。在开发中,我们基本都只关注执行事sql。拿到结果集。

  • 听了 林晓斌 老师的课,总结一下学到的知识。包括博客内很多知识的总结都是来自于老师的课。但是可以保证,绝非copy。而是理解之后,取其能保证自己的理解部分。

 

正文开始

mysql 大致可以分为两部分。

  • server层

  • 存储引擎层

img

server层:包括 连接器  查询缓存  分析器  优化器  执行器 。涵盖 MYSQL 的大多数核心服务功能,以及所有的内置函数(如日期,时间,数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程,触发器,视图等。

 

引擎层:负责数据的存储和提取。架构模式是插件式的,只需要提供对应的接口。MYSQL 支持的存储引擎有 InnoDB  MyISAM Memory 等。现在最常用的是InnoDB。从 mysql-5.5.5 开始成为了mysql的默认引擎。

 

指定存储引擎

  • create table 建表的时候,可以使用 engine 来指定使用的存储引擎.例如

    engine=memory

 

server层执行sql的流程

  • 对比上图来看。记一下具体流程

比如要执行下面这条 sql 语句

xxxxxxxxxxselect * from T where ID=10;

 

1.连接器

  • 顾名思义连接到mysql服务。连接器负责 跟客户端建立连接,获取权限,维持和管理连接

  • 流程

    • 完成经典的 TCP 三次握手

    • 连接器通过账户密码来认证身份。不对就返回错误

    • 通过就会去权限表查询你具有的权限。你在整个连接中所有需要权限验证的地方,都将依赖于这时候查询的权限。也就是说,连接中发生的权限更改,对这次连接不生效。

  • 连接长时间没动静,连接就会处于空闲状态。连接器会自动把它断开。可以由 wait_timeout 控制,默认时间是 8 小时。

连接分类
  • 长连接:是指连接成功后,客户端持续有请求,就一直使用同一个连接。

  • 短链接:每次执行很少查询的时候就断开连接,下次查询重新建立

 

因为建立连接的过程比较复杂,所以尽量使用长连接。但是大量使用长连接会照成内存涨的特别快。

  • 原因是,mysql 语句在执行过程中,临时使用的内存是保存在连接对象里面的 。这些资源在连接断开的时候才会释放的。

  • 如果占用内存太大,会被系统强行杀掉,而我们能看到的是,MySQL 异常重启了。

 

上述问题的解决方案?

    1. 定期断开长连接,或者程序一个占用内存较大的查询之后,断开连接,归还资源


    1. mysql 5.7 之后,设置 mysql_reset_connection 参数初始化资源。这个过程不会重新认证权限。但是可以将资源恢复到刚刚创建完连接时的状态。(推荐)

 

2.查询缓存

  • 查询缓存和我们认识的缓存基本一样。就是一个高速的缓冲区,来提高查询速度

  • 但是查询缓存往往利大于弊。因为如果更新了一张表,所有关于该表的缓存都将被清空。

  • 可以使用 query_cache_type 来按需使用

  • 在 mysql 8.0 之后,彻底删除了该功能。

 

3.分析器

  • 如果没有命中缓存,分析器首先会对 sql 语句进行语法分析。词法分析只会分析语句的词组是否符合要求。

  • 其次进行语法分析,这一步要求更加严格,会分析你的sql语句大致语义。并且加以判断是否合法。就比如你查询了一个不存在的列。 mysql就是在这一阶段判断出来你的错误。

  • 词法分析和语法分析在编译原理中都学习过。理论很丰富和严谨,设计一门语言,必然避不开这两个东西。

 

4.优化器

  • 经过前端的步骤,我们可以保证这个 mysql 语句绝对的正确。但是还需要对mysql语句进行优化

  • 最直观的感受就是表的连接,在学习 sql 设计时我们就知道,表连接的顺序不同,效率也是不一样的

    xxxxxxxxxxselect * from t1 join t2 using(ID)  where t1.c=10 and t2.d=20;

 

5.执行器

  • 执行器,顾名思义就是执行语句。但是正如 前面所说。mysql 的存储引擎是 拔插式

    的。所以mysql的server层都是调用存储引擎的接口来实现数据的查询和更改。