Mysql - 执行Sql语句的内部流程和存储数据的流程

目录

1.在了解执行Sql流程前,我们需要先来了解一下Mysql的内部流程

2.执行流程

3.存储流程


1.在了解执行Sql流程前,我们需要先来了解一下Mysql的内部流程

  • Mysql主要分为两个部分:Server层和存储引擎
    • Server:
      • 主要负责和客户端建立连接,并且解析和执行Sql。
      • 主要的组成部分有:连接器、解析器、预处理器、优化器、执行器等
    • 存储引擎:
      • 主要负责数据的存储和拉取
      • 主要组成部分有:BufferPool(缓冲池)

2.Mysql执行Sql语句的流程

  1. 客户端先会和Mysql的连接器进行http连接,校验账号密码是否正确,最后查询一下账号权限

  2. 连接成功后,客户端就可以向Mysql发送sql语句,如果时select语句,就会先去缓存中查找是否有该sql的记录,如果有则直接返回

  3. 在执行Sql前,sql语句会经过解析器的解析。

    1. 词法分析:它会识别出sql中的关键字,如select、update之类的sql类型、表名、字段名、where条件等等,识别出这些后再会去建立语法树

    2. 语法分析:它会分析sql语句的语法是否符合Mysql语法,如果不符合则报错

  4. 通过了解析器后,预处理器会检测sql语句中的表名、字段名是否存在,将select * 中的 * 符号变成全部的字段属性

  5. 预处理之后,就是优化sql,主要就是负责将sql查询语句的执行计划制定下来,比如表中有多个索引的时候,选择最适合的那一个,或者判断是否使用索引来查询等等。

  6. 制定好执行计划后就会发送到执行器中,最后执行器就会调用执行引擎的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的写操作并不是立即更新到磁盘中,而是先写日志,然后在适合的时间再写到磁盘上)

  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值