Mysql存储引擎是什么?

目录#

定义#

数据库存储引擎是数据库底层软件组织,数据库使用数据引擎进行创建、查询、更新和删除数据,不同的存储引擎提供不同的存储机制、索引等功能。MySQL的核心就是存储引擎。

分类#

  • InnoDB
  • MyISAM
  • 其他

本章将着重介绍InnoDB存储引擎,并讲出和MyISAM的区别

InnoDB#

日志#

Mysql的日志体系是系统运行的必须文件

分类

bin log

  • 是什么

    Mysql Server层的逻辑日志,是二进制格式文件,记录用户对数据库更新的SQL语句信息

    • 写入方式

      bin log 是追加写。“追加写” 是指 bin log 文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。

  • 为什么

    主要用于数据库的数据备份、主从同步、数据恢复

undo log

  • 是什么

    InnoDB的逻辑日志,存储数据会退到之前版本应该执行的SQL语句

  • 为什么

    用于实现MVCC多版本并发控制,事务回退。

    可用于保证可事务的原子性,以及事务隔离级别的实现

redo log

  • 是什么

    InnoDB的物理日志,主要用于存储数据页的变化

    • 写入方式

      redo log 是循环写。也就是说 redo log 只会记录未刷入磁盘的日志,已经刷入磁盘的数据都会从 redo log 这个有限大小的日志文件里删除

    • 特点

      独特的二阶段机制,redo log 写入分为俩个步骤,一个是prepare状态,一个是commit 状态,commit状态才算是完全写入到了 redo log

  • 为什么

    主要用于数据恢复,只要数据保存到了 redo log 就表示已经完成了持久化

redo log 和 bin log 的区别?

  • 作用范围: redo log 在InnoDB存储引擎,而 bin log 作用在Mysql Server层
  • 写入内容: redo log 是物理日志,存储的是数据的变化; bin log 是逻辑日志,存储的是SQL语句信息
  • 写入方式: redo log 是循环写; bin log 是追加写

为什么主从复制要是用 bin log 而不是 redo log ?

区别 + 着重作用范围 + 写入内容俩个方面来回答

  • redo log 是InnoDB物理日志, bin log 是Server层逻辑日志,主从复制中可能有服务器没有使用InnoDB存储引擎

  • redo log 写入的是数据,而 bin log 写入的是语句,主从复制使用操作同步数据效率更高

为什么 bin log 不能用于完成崩溃恢复而 redo log 可以?

区别 + 着重写入方式 + redo log 的二阶段提交确保了可以崩溃恢复

redo log 和 bin log 不同的写入方式决定了 bin log 是不能用于崩溃恢复的。 bin log 是追加写,新的日志不会覆盖旧的数据,且写入的数据是SQL语句; redo log 是循环写,只要数据刷新到了磁盘,那么 redo log 就会删除这部分数据,所以 redo log 中的数据都是还没有刷入磁盘的数据。那么如果使用 bin log 来实现崩溃恢复时, 数据库是无法判断应该执行哪些语句来实现数据恢复,而 redo log 不一样,数据库只需要将 redo log 数据恢复到内存即可

  • 如何确保崩溃恢复?

    • 如果 redo log 里面的事务是完整的,也就是已经有了 commit 标识,则直接提交

    • 如果 redo log 里面的事务处于 prepare 状态,则判断对应的事务 bin log 是否存在并完整

      • a. 如果 bin log 存在并完整,则提交事务

      • b. 否则,回滚事务

锁 + MVCC#

分类

锁粒度

  • 全局锁

  • 表锁

    MyIsAM存储引擎默认使用表锁

  • 行锁

    InnoDB存储引擎默认使用行锁

    分类

    • 排它锁/X锁
    • 共享锁/S锁
    • 规则:一写或者多读

锁模式

  • 行锁

  • 间隙锁

    是什么

    • 数据库中在索引之前存在间隙,间隙锁的作用范围就是间隙;被间隙锁锁住的间隙无法再插入数据

    为什么

    • 在可重复读的事务隔离级别下,间隙锁可以在一定避免幻读的出现
  • Next-Key锁

    行锁+间隙锁;是InnoDB锁的基本单位

事务#

特性

ACID

  • 原子性

    undolog保证原子性

  • 隔离性

    undolog和锁保证隔离性

  • 持久性

    redolog保证持久性

  • 一致性

    以上三点共同保证了一致性

事务在并发情况下的问题

  • 脏读

    事务1和事务2

    事务1可以读取到未提交的事务2修改的数据

  • 不可重复读

    事务1和事务2

    事务1在多次查询数据,事务2对其中数据进行了修改,并提交,那么事务1前后查询的数据值就会发生变化

  • 幻读

    事务1和事务2

    事务1在对多条数据进行修改操作时,事务2删除了其中某一条数据,造成事务1的影响范围发生变化

事务的隔离级别

  • 读未提交

  • 读已提交

    事务读取到的数据并非缓存中的最新数据,而是事务提交之后的数据版本

  • 可重复读

    InnoDB默认的事务隔离级别

    事务读取到的数据版本是事务开始前的数据版本

  • 串行化

    每一步操作都加锁,消耗性能

索引#

Mysql索引

总流程#

  • 事务开始
  • 读取需要处理的行数据到内存
  • 加X锁,写入相反的SQL到 undo log
  • 修改内存中的数据
  • 写入 redo log(prepare状态)
  • 写入 bin log
  • redo log 修改状态为 commit 状态
  • 提交事务,解锁

区别#

MyISAM和InnoDB的区别

  • 事务:MyISAM不支持事务
  • 外键:MyISAM不支持外键
  • :MyISAM的锁最小粒度为表锁
  • 索引:MyISAM使用到的索引结构为非簇集索引,而InnoDB使用的是聚集索引
posted @   互联网农民工  阅读(72)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
more_horiz
keyboard_arrow_up light_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示