MySQL技术:InnoDB存储引擎阅读笔记(一)
第一章以及第二章前半部分
数据库和数据库实例的区别
数据库是二进制文件,存放在二级存储器,数据库实例是程序进程,用来完成对数据库的一系列操作。
数据库体系结构
包括以下几部分:
- 连接池组件
- 管理服务和工具组件
- SQL接口组件
- 查询分析器组件
- 优化器
- 缓冲
- 插件式存储引擎
- 物理文件
InnoDB引擎的特点
- 存储引擎是基于表的,而不是数据库
- 行锁设计
- 支持外键
- 支持非锁定读(默认读操作不会产生锁)
- InnoDB使用MVCC(多版本并发控制)来获得高并发性。实现了SQL标准的4种隔离级别
- 使用next-key locking的策略避免幻读产生
- 提供插入缓冲、二次写、自适应哈希索引、预读等功能
- 可以查看MySQL官方手册了解几个不同存储引擎的区别
InnoDB体系架构
InnoDB存储引擎有多个内存块,可以认为这些内存块组成一个大的内存池,负责:
- 维护所有进程/线程需要访问的多个内部数据结构
- 缓存磁盘上数据,方便快速地读取,同时对磁盘文件的数据修改之前在这里缓存
- 重做日志缓冲
后台线程的主要作用是刷新内存池中的数据,保证缓冲池中内存缓存的是最新的数据,此外将已经修改的数据文件刷新到磁盘文件,保证在数据库发生异常的情况下InnoDB能回复到正常运行状态。
线程
InnoDB是多线程的模型。所以后台有多个不同的后台线程,处理不同任务。
- Master thread:核心的后台线程,负责将缓冲池中的数据异步刷新到磁盘,保证数据一致性。包括1脏页的刷新,2合并插入缓冲,3UNDO页的回收。
- IO Thread:InnoDB中大量使用AIO处理IO请求。IO Thread负责这些IO请求的回调处理。
- Purge Thread:事务被提交后,其锁使用的undo_log可能不再需要,因此需要Purge Thread来回收已经使用并分配的undo页。Purge Thread以前是在Master Thread中的,现在可以单独作为线程使用,使用 innodb_purge_threads = 1来启用,且支持多个线程。
- Purge Cleaner Thread :将之前版本中脏页的刷新操作都放入到单独的线程中来完成,减轻Master Thread的工作,以及对于用户查询线程的阻塞。
内存
InnoDB存储引擎是基于磁盘存储的。将记录按照页的方式进行管理。 缓冲池的作用是为了缓解cpu速度和磁盘读取速度的差距。 缓冲池简单说 就是 一块内存区域。通过内存速度来弥补磁盘速度较慢对数据库性能影响。
- 读取操作:先将磁盘的页放入缓冲池,如果下一次再读取相同的页,判断是否在缓冲池中,如果在,就是命中,不在,则从磁盘读取。
- 修改操作:先修改在缓冲池中的页,以一定频率刷新到磁盘上。以一种Checkpoint机制刷新回到磁盘。
- 缓冲池大小可以通过 参数 innodb_buffer_pool_size 设置。
- 缓冲池中具体缓存的数据页,不能简单地认为只有索引页和数据页。如下图:
|