学习目标
我希望了解一下Mysql的工作原理,实现这个工作原理的各个模块是如何协同工作的。
学习内容
- 服务端与客户端
- 服务端与客户端如何通信
- 存储引擎
- 存储结构
具体细节
-
这里先放上Mysql可视化结构,来自B站
-
服务端
服务端也就是我们常说的Mysql,关系型资料库管理系统。Mysql在后台帮我们组织和管理数据,向我们提供服务。 -
客户端
客户端也就是“程序员”用于管理、可视化、开发服务端的工具,像Mysql workbench。
-
如何与服务端通信的
客户端连接驱动诸如 ODBC JODBC连接驱动可以和Mysql的连接模块进行连接和通讯。
连接模块后来演变成了连接池,因为连接池是对外连接的唯一模块,参数配置很重要。连接驱动和连接池建立连接后,SQl语句从客户端发往服务端, ==> 然后被SQL接口和SQL解析器接受和解析, ==>命令成功解析后再被转送给SQL语句优化器,优化器优化任务语句, ⇒ 优化后的SQL语句会被送给存储引擎比如InnoDB执行增删改查动作。
-
存储引擎
写入
: 第一步:存储引擎调用执行器将旧值写道 磁盘的 undo log区用于支持回滚
第二步:将内存中的数值插入buffer pool
第三步:数值通过IO线程写入磁盘
其实这个步骤很复杂,远远不止上面写步骤,仅作为了解到此为止。查询
:第一步客户端发送SQL指令
第二步:指令通过连接池发送给SQL接口,被SQL解析器解析
第三步:解析器把解析结果丢给预处理器+优化器
第四步:最终的SQL语句被执行器接受
第五步:执行器调用存储引擎拿数据
第六步:拿到数据的执行器将数据通过连接池返回给客户端
-
存储结构
建立新表是指定的存储引擎不同可能存在着存储结构的不一样。
大致思路可以参考文件系统的管理方式。
一般就是建表会生成一个独立表空间,可以想象为一块独立的磁盘,这个磁盘的基本构成单元称为页,大小16KB,多个页组成区,多个区组成 组,然后多个组形成表空间。