MySQL 的默认存储引擎:InnoDB

InnoDB 存储引擎是 MySQL 默认的存储引擎,采用 MVCC(多版本并发控制)实现高并发,支持 4 种隔离级别,默认级别是 Repeatable Read(可重复读),使用 next-key locking 策略防止幻读的出现。

定义 InnoDB 表时没有指定主键,那么存储引擎会为每一行的数据自动生成 6 字节的 ROWID 作为主键。

一、特点

1、InnoDB DML 操作遵循 ACID 模型,具有提交、回滚和崩溃恢复功能的事务更好地保护用户数据。

2、行级锁定和 Oracle 风格的一致读取提高了多用户的并发性和性能。

3、InnoDB 表会将数据安排在磁盘上以基于主键优化查询。每个表都有主键索引组织数据以最大程度减少主键查找的 I/O。

4、为了维护数据的完整性,InnoDB 支持外键约束。使用外键检查插入、更新和删除以确保他们不会导致相关表之间的不一致。

二、工作方式

存储引擎会将数据库文件按页(每页 16k)读取到缓冲池,然后通过 LRU 算法(最近最少使用)管理缓存的数据。当文件需要修改时,首先修改缓冲池的页(修改后此页就是脏页),然后将脏页按一定的频率刷新(flush)到文件。

三、体系架构

InnoDB 架构由后台线程和内存池组成。后台线程主要作用是刷新内存池的数据,使内存缓存的是最近的数据、将已修改的数据刷新到磁盘文件、故障发生时恢复到正常运行状态;而内存主要作用是维护所有进/线程所需的数据结构、缓存磁盘上的数据、重做 redo log 日志缓存。

1. 后台线程

后台线程默认情况有 7 个线程组成:4 个 I/0 thread(insert buffer thread, log thread, read thread, write thread)、1 个 master thread、1 个 lock 监控线程和 1 个错误监控线程。master thread 优先级是最高的,因为它负责处理引擎绝大多数工作。

2. 内存

内存模块由 3 个内存池组成:缓冲池(buffer pool)、重做日志缓冲池(redo log buffer)和额外的内存池(additional memory pool)。

缓冲池占据内存最大块的部分,因为要用来存放各种数据的缓存,缓存的主要是索引页、数据页,也有其它类型的页:undo 页、插入缓冲(insert buffer)、自适应哈希索引(adaptive hash index)、InnoDB存储的锁信息(lock info)、数据字典信息(data dictionary)。

重做日志缓冲池的大小不用太大,确保能处理每秒产生的事务量就行,工作流程是将重做日志信息写入池中,然后按频率每秒(一般情况下)将其刷新到重做日志文件中。

额外的内存池大小设置应当参考缓冲池的大小,因为当池内存不够就需向缓冲池申请空间,但每个缓冲池的帧缓冲和对应的缓冲控制对象(记录着 LRU、锁和等待的信息)所需的内存是从额外的内存池申请的。

四、参考资料

高性能 MySQL

MySQL 技术内幕:InnoDB 存储引擎

MySQL 官方文档

猜你喜欢

转载自juejin.im/post/7017720643865018382