人的知识就好比一个圆圈,圆圈里面是已知的,圆圈外面是未知的。你知道得越多,圆圈也就越大,你不知道的也就越多。

0%

MySQL 基础架构

Mysql 基础架构示意图如下:
MySQL基础架构示意图

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

Server 层

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

连接器

连接器负责跟客户端建立连接、获取权限、维持和管理连接。

长连接

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

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

  • 定期断开长连接。使用一段时间,或者程序里面判断执行过一个占用内存的大查询后,断开连接,之后要查询再重连。
  • 在每次执行一个比较大的操作后,通过执行 mysql_reset_connection 来重新初始化连接资源。这个过程不需要重连和重新做权限验证,但是会将连接恢复到刚刚创建完时的状态。

查询缓存

MySQL 拿到一个查询请求后,会先到查询缓存看看,之前是不是执行过这条语句。之前执行过的语句及其结果可能会以 key-value 对的形式,被直接缓存在内存中。

不建议使用查询缓存,因为它通常弊大于利,除非业务表是一张静态表,很长时间才更新一次。

从 MySQL 8.0 开始,已经将查询缓存的整块功能删掉了。

分析器

分析器会先做“词法分析”,然后做“语法分析”,根据词法分析的结果,语法分析器会根据语法规则,判断输入的 SQL 语句是否满足 MySQL 语法。如果你的语句不对,就会收到“You have an error in your SQL syntax”的错误提醒。

优化器

优化器是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序。

执行器

开始执行之前,会判断当前用户是否有权限执行操作,如果没有,就会返回没有权限的错误,如果有,就打开表继续执行。打开表的时候,执行器会根据表的引擎定义,去使用这个引擎提供的接口。

存储引擎层

存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持 InnoDB、MyISAM、Memory 等多个存储引擎,最常用且默认的是 InnoDB。

小礼物走一走,来 Github 关注我