天天看点

MySQL基本架构(一)

MySQL基本架构:

MySQL基本架构(一)

从图中很容易就能看出,MySQL可以分为Server层和存储引擎层两部分。

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

而存储引擎层负责数据的存储和提取,它支持多种的存储引擎,比如:InnoDB、MyISAM、Memory等。InnoDB是MySQL5.5版本后的默认引擎,也是最常用的。

在我们日常的MySQL使用中,假如我们要建一张表,那么默认就会选用InnoDB,如果想要改变存储引擎的话,可以在建表语句中加入engine=memory,至于不同存储引擎的功能区别我们也要以后再聊。

从上图我们不难看出,不同的存储引擎都是用一个相同的Server层,那么接下来我们主要针对Server层来介绍一条简单sql语句是如何被MySQL执行的(大家着重看每个组件的作用)。

连接器:

首先是要连接数据库,连接器就是在最外层的大门,你要与MySQL建立连接必须通过它才行。

那么请大胆猜测连接器的功能:

没错说先就是与客户端建立连接,那建立连接的目的是什么呢?

相信聪明的你也想到了,就是获取客户端拥有的权限。

那除此之外呢?我们还应该从连接器的角度出发,既然建立了连接,那肯定要维持和管理这条连接啦。(连接:“你可一定要对人家负责呀,嘤嘤嘤!”)。所以我们将上面的分析进行总结。

连接器的功能:

1.跟客户端建立连接

2.获取权限

3.维持和管理连接

连接命令:

mysql -h$ip -P$port -u$user -p
           

如果用户名密码认证通过,连接器会到权限表里面查出你拥有的权限。之后,这个连接里面的权限判断逻辑,都将依赖于此时读到的权限。 

看到这里细心的朋友就会问了,既然获取权限是在建立连接时完成的,那管理员在我建立连接之后才对我的权限进行修改,岂不是我只要不退,就依然可以使用之前的权限?(管理员:“合着您搁我这卡bug呢?”)

不过诸位大聪明们的想法是完全正确的。(没想到吧?臭弟弟。)

连接完成后,如果你没有后续的动作,这个连接就处于空闲状态,你可以在show processlist命令中看到它。

MySQL基本架构(一)

 (不要告诉我接受过九年义务劳动的你连Sleep是啥意思都母鸡)

客户端如果太长时间没动静,连接器就会自动将它断开。这个时间是由参数wait_timeout控制的,默认值是8小时。

如果在连接被断开之后,客户端再次发送请求的话,就会收到一个错误提醒: Lost connection to MySQL server during query。这时候如果你要继续,就需要重连,然后再执行请求了。

看到这里鸡贼的小盆友们又想到了,那连接是不是根据连接断开时间可以分一下种类呢?

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

建立连接的过程通常是比较复杂的,所以我建议你在使用中要尽量减少建立连接的动作,也就是尽量使用长连接。

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

怎么解决这个问题呢?你可以考虑以下两种方案。

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

总之就是想让MySQL更流畅,就得你费心力去多多维护和优化了。 

下期将会描述其他组件的作用,接下来想与大家谈谈如何学习。

现在社会节奏很快,内卷又厉害,我身边也有很多同事或者朋友内心都很浮躁,凡事都要图快,讲的就是一个速度,个人感觉这和网络上那些贩卖焦虑的不良网课商家有很大关系。

其实学习这种事情最好是量力而为,一天的时间学到自己觉得快要饱和的时候就不要勉强自己再去学了,勉强坚持效率很低,大家最好是稳步前进,踏下心来,一步一步从基础走向进阶,身边大佬如云也好,天才辈出也罢,都不是你折磨自己的理由,只要每天都在进步,天天都在完善自身,那总有一天你能超越自己,莫向外求。

实不相瞒,我也只是一个初出茅庐的小萌新,写博客主要是想印证自身和定期复习之外,能够和诸位同道交流切磋,共同进步,所以如果觉得博文有什么错误,或者笔者有什么思路是错误的,大家尽管提出来,不要客气!