type
status
date
slug
summary
tags
category
icon
password

1、存储引擎分类

存储引擎是底层物理结构的实现,负责数据的存储和提取。常用的存储引擎有 InnoDB、MyISAM、Memory 等。每个存储引擎都有各自的特点,可以根据具体的应用建立不同存储引擎表。最常用的存储引擎是 InnoDB,它从 MySQL 5.5.8 版本开始成为默认的存储引擎。
请注意:存储引擎是基于表的,而不是基于库的。所以我们可以在同一个数据库里面建立多个类型的表,存储引擎也可被称为表类型。
查看当前 MySQL 支持的存储引擎:
主要存储引擎对比:
存储引擎
MyISAM
InnoDB
Memory
存储结构
每个MyISAM表在磁盘上存储成三个文件。分别为: • .frm文件:表定义文件,存储表的定义数据 • .MYD文件:数据文件,存放表具体记录的数据 • .MYI 文件:索引文件,存储索引。
所有的表都保存在同一个数据文件中(也可能是多个文件,如果设置了独立的表空间文件),InnoDB表的大小只受限于操作系统文件的大小,一般为2GB。
所有的数据都保存在内存中,不需要进行磁盘I/O。
事务
不支持事务
支持事务
不支持事务
表级锁
行级锁,并使用MVCC支持高并发
表级锁
外键
不支持
支持
不支持
索引
非聚集索引
聚集索引
非聚集索引
安全恢复
崩溃后无法安全恢复
支持安全恢复
如果数据库重启或发生崩溃,Memory表的结构还会保留,但数据会丢失。
其他
MyISAM 用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快。
InnoDB 不保存表的具体行数,执行 select count(*) from table 时需要全表扫描。
存储引擎的选择:
  • 如果系统主要以读操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完整性、并发性要求不是很高,可以选择 MyISAM。
  • 如果需要临时表快速地访问数据,并且表数据不多,数据不会被修改,重启以后丢失也没有关系,可以选择 Memory 表。
  • 其他情况优先 InnoDB。因为 InnoDB 具有事务、恢复速度快等优点。
如果表的数据非常大查询频繁,可以优先考虑分库分表,而不是修改存储引擎。

2、InnoDB下更新SQL的执行过程

以下面这条更新 SQL 为例
SQL 的整体执行流程如下。大部分执行步骤和查询过程相同,我们重点关注第 4 步存储引擎部分的执行过程:
  1. 客户端连接到MySQL服务器,将SQL更新语句发送到服务器;MySQL服务器连接池中会有一个连接和客户端建立连接,然后后台线程会从连接中获取到要执行的SQL语句,并发送给SQL接口去调度执行。
  1. 查询缓存。注意增删改时,会将查询缓存中 user 表相关的缓存都清空。
  1. SQL语句经过SQL解析器解析、优化器优化,得到一个执行路径,前面这些和执行查询其实都是类似的。
  1. 接着由执行引擎去调用底层的存储引擎接口,根据执行计划完成SQL语句的执行。
    1. 首先查询出要更新的数据,这一步会先判断缓冲池(Buffer Pool)中是否已经存在这条数据,如果已经存在了,则直接从缓存池获取数据返回。否则从磁盘数据文件中加载这条数据到缓冲池中,再返回数据。
    2. 获取到数据后,执行引擎会根据SQL更新数据,然后调用存储引擎更新数据。这一步会对数据加排它锁,避免并发更新问题。之后先写 undolog 到缓冲池,undolog 主要用于事务回滚、MVCC等;同时,undolog 也会产生 redolog 日志。
    3. 之后更新缓冲池中的数据,同时记录 redolog 到 RedoLog 缓冲池,redolog 主要用于保证数据的持久性,宕机恢复数据等。
    4. 最后提交事务,虽然没有手动 commit 提交事务,update 语句执行完成后也会有隐式的事务提交的。事务提交时,会先在MySQL服务器层面会写入 binlog,binlog是数据持久性的保证。最后将 redolog 刷入磁盘,完成事务提交。·
  1. 最底层的一部分就是磁盘上的数据文件、日志文件等,可以看到,InnoDB 设计了缓冲池来缓冲数据、undolog、redolog 等,这些内存中的数据最终都是要刷新到磁盘中才能保证数据不丢失的。至于为什么要这么设计,我们后面再分析。
notion image
Mysql存储引擎篇:InnoDB数据文件存储Mysql基础篇:整体结构和SQL的执行过程
mcbilla
mcbilla
一个普通的干饭人🍚
Announcement
type
status
date
slug
summary
tags
category
icon
password
🎉欢迎来到飙戈的博客🎉
-- 感谢您的支持 ---
👏欢迎学习交流👏