让人心动的mysql体系结构和InnoDB存储引擎知识详解

本篇文章给大家带来了MYSQL进阶之体系结构和InnoDB存储引擎的相关知识,希望对大家有帮助。 MySQL基本架构图 大体来说,MySQL 可以分为 Server 层和存储引擎层两部分。 Server 层包括连接器

    本篇文章给大家带来了MYSQL进阶之体系结构和InnoDB存储引擎的相关知识,希望对大家有帮助。

MySQL基本架构图

38.png

大体来说,MySQL 可以分为 Server 层和存储引擎层两部分。

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

连接器

连接器就是你连接到数据库时使用的,负责跟客户端建立连接、获取权限、维持和管理连接。

命令: mysql -h$ip -P$port -u$user -p,回车后输密码,也可以在 -p 后面输入密码,但是有密码泄露的风险。

show processlist,可以查看连接的情况,Command 列中有一个 Sleep 表示连接空闲。

39.png

空闲连接默认8小时会被断开,可以由wait_timeout参数配置。

在数据库中,长连接是指连接成功后,如果客户端持续有请求,则一直使用同一个连接。短连接则是指每次执行完很少的几次查询就断开连接,下次查询再重新建立一个。

由于建立连接比较耗资源,所以建议尽量使用长连接,但是使用长连接后,MySQL 占用内存涨得特别快,这是因为 MySQL 在执行过程中临时使用的内存是管理在连接对象里面的。这些资源会在连接断开的时候才释放。所以如果长连接累积下来,可能导致内存占用太大,被系统强行杀掉(OOM),从现象看就是 MySQL 异常重启了。

解决方案:

定期断开长连接。使用一段时间,或者程序里面判断执行过一个占用内存的大查询后,断开连接,之后要查询再重连。

如果你用的是 MySQL 5.7 或更新版本,可以在每次执行一个比较大的操作后,通过执行 mysql_reset_connection 来重新初始化连接资源。这个过程不需要重连和重新做权限验证,但是会将连接恢复到刚刚创建完时的状态。

查询缓存

查询缓存是将之前执行过的语句及其结果以 key-value 对的形式缓存在内存中。key 是查询的语句,value 是查询的结果。如果你的查询能够直接在这个缓存中找到 key,那么这个 value 就会被直接返回给客户端。

查询缓存在MYSQL8时被移除了,由于查询缓存失效频繁,命中率低。

分析器

分析器先会做“词法分析”,识别出里面的字符串分别是什么,代表什么。然后需要做“语法分析”,判断你输入的这个 SQL 语句是否满足 MySQL 语法。

优化器

执行器

存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持 InnoDB、MyISAM、Memory 等多个存储引擎。现在最常用的存储引擎是 InnoDB,它从 MySQL 5.5.5 版本开始成为了默认存储引擎。

一条 Select 语句执行流程

40.png

上图以 InnoDB 存储引擎为例,处理过程如下:

用户发送请求到 tomcat ,通过 tomcat 链接池和 mysql 连接池建立连接,然后通过连接发送 SQL 语句到 MySQL;

MySQL 有一个单独的监听线程,读取到请求数据,得到连接中请求的SQL语句;

将获取到的SQL数据发送给SQL接口去执行;

SQL接口将SQL发送给SQL解析器进行解析;

将解析好的SQL发送给查询优化器,找到最优的查询路劲,然后发给执行器;

执行器根据优化后的执行方案调用存储引擎的接口按照一定的顺序和步骤进行执行。

举个例子,比如执行器可能会先调用存储引擎的一个接口,去获取“users”表中的第一行数据,然后判断一下这个数据的 “id”字段的值是否等于我们期望的一个值,如果不是的话,那就继续调用存储引擎的接口,去获取“users”表的下一行数据。 就是基于上述的思路,执行器就会去根据我们的优化器生成的一套执行计划,然后不停的调用存储引擎的各种接口去完成SQL 语句的执行计划,大致就是不停的更新或者提取一些数据出来。

在这里涉及到几个问题:

MySQL驱动到底是什么东西?

以java为例,我们们如果要在Java系统中去访问一个MySQL数据库,必须得在系统的依赖中加入一个MySQL驱动,比如在Maven里面要加上