MySQL存储引擎
MySQL体系结构
MySQL服务端的体系结构是分层的
连接层
连接层 是Server层的最外层,是 客户端 和 数据库 打交道的第一个入口
作用
- 建立连接
- 身份验证 & 权限校验
- 连接管理
- 连接池功能
服务层
它是介于 连接层 和 存储引擎层 之间的中间层,主要负责 SQL 的接收、解析、优化和执行调度、完成缓存的查询,但 不直接存储数据
所有跨存储引擎的实现都是在服务层的
作用
- SQL 接收与解析
- 接收从连接层传过来的 SQL 语句
- 交给 解析器 转成语法树,方便后续处理
- SQL 优化
- 把语句翻译成执行计划
- 比如 SELECT * FROM user WHERE name=‘Tom’ AND age=20;
- 优化器决定用哪个索引更快
- 决定多表查询时的 join 顺序
- 执行调度(执行器)
- 按照优化器的执行计划,逐步调用存储引擎接口
- 比如执行器发指令
- “InnoDB,请帮我查 user 表主键=1 的那一行。”
- 权限校验
- 检查用户是否有执行这条 SQL 的权限(比如能不能查这个表、能不能更新字段)
存储引擎层
上图中的蓝桶实际上就是一个一个的 存储引擎(若现有的存储引擎不能满足需要,还可以进行拓展)
存储引擎层 是 MySQL 体系结构的 最底层,它是 真正和磁盘/内存打交道的模块,负责 数据的存储、索引和读取,服务器通过API和存储引擎进行通信
索引是在存储引擎中实现的,意味着不同的存储引擎的索引结构不同,它们的功能也不同
作用
- 数据存储与管理
- 决定数据在磁盘上怎么组织(页、区、段、表空间)
- 决定索引结构(B+树、哈希等)
- 索引维护
- 比如 InnoDB 里的主键索引(聚簇索引)、辅助索引
- 负责插入、更新时自动维护索引结构
- 事务支持(不同引擎差异很大)
- InnoDB:支持事务(ACID)、行级锁、MVCC
- MyISAM:不支持事务,只有表级锁
- 锁机制
- 决定并发控制的粒度
- 行锁、表锁、意向锁等,都是引擎层在实现
- 缓存与日志
- InnoDB 有 buffer pool、redo log、undo log,保证性能和数据一致性
- 其他引擎可能实现不同
存储层
主要是存储数据库的相关数据,包含一系列日志
将数据存储在文件系统之上,并完成与存储引擎的交互
存储引擎
存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式
存储引擎基于数据库表,不是基于数据库的——》一个数据库下的多张表可以选择不同的存储引擎(存储引擎也被称为表的类型)
建表时,没有指定存储引擎,默认InnoDB(MySQL 5.5后)
- 指定存储引擎
create table 表名(
字段1 类型,
...
字段n 类型,
)ENGINE = INNODB;
- 查看当前数据库支持的存储引擎
show engines;
InnoDB 存储引擎
InnoDB 是一种兼顾 高可靠性 和 高性能 的通用存储引擎,在MySQL5.5之后,InnoDB是默认的 MySQL 存储引擎
在磁盘中涉及到的文件
InnoDB 引擎的每张表都会对应一个 ×××.ibd 的表空间文件(×××是表名),该文件存储 表的结构、数据和索引
(二进制文件,不能直接在记事本中打开)
支持事务、外键、行级锁
逻辑存储结构
分为五个部分
TableSpace:表空间
Segment:段
Extent:区
Page:页
Row:行
表空间(TableSpace)包括段(Segment)
段(Segment)包括区(Extent)
区(Extent)包含页(Page)
页(Page)包含行(Row)
Trx id :最后一次操作事务的id
Roll pointer : 指针
col… : 字段
页 是磁盘操作的 最小单元
一个 区 的大小是固定的 1M
一个 页 的大小是固定的 16K
一个区中可以包含64个页
MyISAM 存储引擎
MyISAM 是 MySQL 早期默认的存储引擎
特点:
不支持事务和外键
支持表锁,不支持行锁
访问速度快
在磁盘中涉及到的文件:
.MYD :存放数据
.MYI :存储索引
.sdi : 存储表结构的信息
Memory 存储引擎
Memory 引擎的表的数据存储在内存中,由于收到硬件问题和断电问题的影响,只能将这些表作为临时表或缓存使用
特点:
内存存放,访问速度快
hash索引
在磁盘中涉及到的文件:
.sdi :存储表结构信息