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默认的事务隔离级别
事务读取到的数据版本是事务开始前的数据版本
-
串行化
每一步操作都加锁,消耗性能
索引#
总流程#
- 事务开始
- 读取需要处理的行数据到内存
- 加X锁,写入相反的SQL到 undo log
- 修改内存中的数据
- 写入 redo log(prepare状态)
- 写入 bin log
- redo log 修改状态为 commit 状态
- 提交事务,解锁
区别#
MyISAM和InnoDB的区别
- 事务:MyISAM不支持事务
- 外键:MyISAM不支持外键
- 锁:MyISAM的锁最小粒度为表锁
- 索引:MyISAM使用到的索引结构为非簇集索引,而InnoDB使用的是聚集索引
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现