目录
1.在了解执行Sql流程前,我们需要先来了解一下Mysql的内部流程
2.执行流程
3.存储流程
1.在了解执行Sql流程前,我们需要先来了解一下Mysql的内部流程
- Mysql主要分为两个部分:Server层和存储引擎层
- Server:
- 主要负责和客户端建立连接,并且解析和执行Sql。
- 主要的组成部分有:连接器、解析器、预处理器、优化器、执行器等
- 存储引擎:
- 主要负责数据的存储和拉取
- 主要组成部分有:BufferPool(缓冲池)
2.Mysql执行Sql语句的流程
- 客户端先会和Mysql的连接器进行http连接,校验账号密码是否正确,最后查询一下账号权限
- 连接成功后,客户端就可以向Mysql发送sql语句,如果时select语句,就会先去缓存中查找是否有该sql的记录,如果有则直接返回
- 在执行Sql前,sql语句会经过解析器的解析。
- 词法分析:它会识别出sql中的关键字,如select、update之类的sql类型、表名、字段名、where条件等等,识别出这些后再会去建立语法树
- 语法分析:它会分析sql语句的语法是否符合Mysql语法,如果不符合则报错
- 通过了解析器后,预处理器会检测sql语句中的表名、字段名是否存在,将select * 中的 * 符号变成全部的字段属性
- 预处理之后,就是优化sql,主要就是负责将sql查询语句的执行计划制定下来,比如表中有多个索引的时候,选择最适合的那一个,或者判断是否使用索引来查询等等。
- 制定好执行计划后就会发送到执行器中,最后执行器就会调用执行引擎的API进行真正的处理,然后返回结果
3.Mysql存储一行记录的流程
3.1.数据库中的表空间:分为4部分,从大到小分别为:段(Segment)、区(Extent)、页(Page)、行(row)。其中Mysql是按页来读写的,每个页默认大小为16KB
3.2.Innodb中的行格式 - Compact格式
- 主要分为两大部分:额外信息和真实数据。其中额外信息又包括可变字段列表、NULL值列表和记录头信息;真实数据包括多列的值、row_id、trx_id、roll_ptr
- 变长字段长度列表:varchar类型字段就是变长字段,用逆向存储的方式记录变长字段的长度。如我们先创建这样一张表,字符集是 ascii(所以每一个字符占用的 1 字节),行格式是 Compact,t_user 表中 name 和 phone 字段都是变长字段。现在我们向表中添加三条记录
第一行的记录为:
我们需要要记录varchar类型的字段,也就是name和phone,然后在第一行中name=a相对于1字节,十六进制0x01;phone=123相当于3字节,十六进制0x03,最后按逆向存储就是03 01
- NULL值列表:用二进制加上逆向存储的方式记录列值中的null值列表,我们以上面的图为例子,在第二行记录中,age的值为null,所有null值用十六进制表示为0x04
- 记录头信息:主要有delete_mark(标识此条记录是否被删除,1为删除)、next_record(下一条记录的位置)、record_type(当前数据的类型,0表示普通记录,1表示B+树非叶子节点记录,2表示最小记录,3表示最大记录)等
- row_id:如果我们建表的时候指定了主键或者唯一约束列,那么就没有 row_id 隐藏字段了。如果既没有指定主键,又没有唯一约束,那么 InnoDB 就会为记录添加 row_id 隐藏字段。row_id不是必需的,占用 6 个字节。
- trx_id:事务id,表明这个数据是由哪个事务生成的
- roll_ptr:表明这条记录上个版本的指针
3.3.存储流程:
1.Server层的执行器执行SQL,缓冲池从磁盘中拉取数据到缓存页中
2.修改缓存页中对应的数据,并且记录修改的数据到redo_log文件中
3.最后新开一个后台线程来定时将脏页中的数据更新到磁盘中,这就是WAL技术(MySQL的写操作并不是立即更新到磁盘中,而是先写日志,然后在适合的时间再写到磁盘上)