存储引擎学习笔记

本文介绍了SQL语句在MySQL上的执行过程,包括通过网络连接经SQL接口、解析器、优化器和执行器生成执行计划并执行。还阐述了InnoDB缓冲池的作用、Undo日志用于数据回滚、更新缓冲池数据,以及Redo log buffer防止数据宕机丢失,最后说明了事务日志提交的不同策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 一条sql语句是怎样执行的
    1. 系统通过建立网络连接发送到mysql 上,然后经过sql接口,解析器,优化器,执行器几个环节,解析sql,生成执行计划,由执行器负责这个计划执行,调用innodb存储引擎的接口去执行。
  2. innodb重要内存结构-缓冲池
    1. 缓存很多数据,当缓存中有数据时就不需要去查询磁盘中的数据

    2. 当存储引擎更新数据时,where id=xx,会将id=xx这行数据看看是否在缓冲池中,如果不在就需要从磁盘中加载到缓冲池中来,而且还会对这行记录加独占锁。避免并发对数据造成不一致性。
  3. undo日志
    1. update user set name=xx where id =10,执行语句时先把name原先的值和id=10写入undo日志中,以便于后续可能要回滚数据

  4. 更新缓冲池中的数据
    1. 当将磁盘中的数据加入到缓冲池中之后对数据加锁之后,还把旧数据写入到undo日志里,这时候就可以开始正式更新数据了,更新的时候先更新缓冲池中的数据,此时该数据就是脏数据

    2. redo log buffer:万一数据宕机,如何避免数据丢失

      1. 此时宕机,现在已经将内存中的数据修改了,但是磁盘中的数据没有修改,必然会造成数据丢失。此时就需要将内存修改的数据写入到redo log buffer里去,用来存放redo日志,记录对数据做了什么。

      2. 提交事务日志

        1. 当我们提交一个事务,此时就会根据一定的策略将redo日志从redo log buffer里刷入磁盘文件中去,这个策略通过innodb_flush_log_at_trx_commit来配置,他有几个选项

          1. 0的时候不会将redo log buffer文件刷入磁盘文件中,宕机就会出现内存数据丢失

          2. 1的时候,提交事务的时候,就必须将内存刷入到磁盘文件中

            1. ​​​​​​​

          3. 2的时候将redo log buffer 提交到redo日志的缓存文件中,而不是进入磁盘文件,可能1miao后才刷入磁盘文件中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值