从 MySQL5.5.8 版本开始 InnoDB存储引擎 是默认的存储引擎. 该存储引擎是第一个完整支持ACID事务的存储引擎.
特点: 行锁, 支持MVCC, 支持外键, 提供一致性非锁定读.
据测试, InnoDB存储引擎能处理 800次/秒的插入/更新操作, 是一个高性能, 高可用, 高可扩展的存储引擎.
下来介绍下 InnoDB核心特性:
1. Checkpoint 技术
缓冲池的设计目的是协调 CPU速度与磁盘速度的鸿沟. 但是缓冲池会带来缓存与磁盘数据不一致问题,也就是脏页问题, 所以需要将新页从缓冲池刷新到磁盘.
倘若每次一个页的数据发生变化, 就将新的页刷新到磁盘, 那么这个开销是非常大的.
若热点数据集中在某几个页中, 那么数据库的性能将变得非常差. 同时, 如果在从缓冲池将页的新版本刷新到磁盘时发生了宕机, 那么数据就不能恢复了.
为了避免发生数据丢失的问题, 当前事务数据库系统普遍采用了 Write Ahead Log 策略, 即当事务提交时, 先写重做日志, 再修改页. 当由于宕机而丢失数据时, 可通过重做日志来完成数据的恢复.
但是 当数据库运行了很久后宕机, 重做日志数据会非常大, 导致恢复时间很长, 此时恢复的代价就很大.
因此 Checkpoint(检查点) 技术 的目的就是解决以下问题的:
- 缩短数据库的恢复时间;
- 缓冲池不够用时, 将脏页刷新到磁盘;
- 重做日志不可用时, 刷新脏页.
当数据库发生宕机时, 数据库不需要重做所有的日志, 因为 Checkpoint 之前的页都已经刷新回磁盘. 故数据库只需要对 Checkpoint 后的重做日志进行恢复. 这样就大大缩短了恢复时间.
当缓冲池不够用时, 根据 LRU 算法找出应该淘汰的页, 若此页为脏页, 那么需要强制执行 Checkpoint, 将脏页刷新回磁盘.
InnoDB 存储引擎中, Checkpoint 发生的时间, 条件及脏页的选择都非常的复杂. 而Checkpoint所做的是事无外乎是将缓冲池中的脏页刷回磁盘.
2. Insert Buffer 插入缓冲
2.1 Insert Buffer
注意: Insert Buffer 是物理页的一部分, 不是缓冲池奥~
使用条件: 非唯一 的 辅助索引.
索引不能是唯一索引, 因为在插入缓冲时, 数据库并不去查找索引页来判断插入记录的唯一性. 如果去查找肯定又会有离散读取的情况发生,
从而导致插入缓冲失去了意义.
That, as we all know: InnoDB存储引擎中, 唯一索引是聚集索引, 插入是非常快的.
但是在实际的业务中, 还是有很多的场景的: 比如有非唯一的辅助索引, 那么这个时候在进行插入操作的时候, 对于非聚集索引叶子节点的插入不再是顺序的了, 这时就需要离散的访问非聚集索引页, 由于随机读取的存在而导致了插入操作的性能下降.
过程:
InnoDB存储引擎的 Insert Buffer(插入缓冲) , 对于非聚集索引的插入或者更新操作, 不是每一次直接插入到索引页中, 而是先判断插入的非聚集索引是否在缓冲池中, 若在则直接插入;
若不在, 则先放到一个 Insert Buffer 对象中, 然后再以一定的频率和情况进行 Insert Buffer 和辅助索引叶子节点的 合并操作.
合并
Insert Buffer 中的记录在以下几种情况下回合并
- 辅助索引页被读取到缓冲池时;
- 该辅助索引页没有使用空间时;
- Master Thread 定时任务
2.2 Change Buffer
就像是 Insert Buffer 的升级, InnoDB存储引擎可以对 DML 操作的插入, 删除, 更新都进行缓冲.
使用条件依然是 非唯一的辅助索引.
3. Double Write 两次写
解决部分页失效问题
Insert Buffer 带给InnoDB存储引擎的是性能的提升, 那 Double Write 带来的则是数据页的可靠性.
试想一下: InnoDB存储引擎正在写入某个页到表中, 而这个页只写了一部分, 没写完整的16K. 此时数据库宕机了, 这种情况称为 部分页失效.
Double Write 由两部分组成, 一部分是 内存中的 doublewrite buffer, 大小为2M, 另一部分位于物理磁盘上共享表空间中. 如下图:

过程:
在对缓冲池中的脏页进行刷新时, 并不直接写磁盘, 而是一个函数将脏页先复制到内存中的 doublewrite buffer , 之后通过 doublewrite buffer 再分两次写, 每次 1M 顺序写入共享表空间的磁盘上, 然后调用 fsync 函数, 同步磁盘, 避免缓存写带来的问题.
在这个过程中, 因为 doublewrite 是连续的, 因此这个过程是顺序写的, 开销不是很大. 在完成 doublewrite 页的写入后, 再将 doublewrite buffer 中的页写入各个表空间文件中, 此时的写入是离散的.

如果操作系统在将页写入磁盘的过程中发生了崩溃, 在恢复过程中, InnoDB 存储引擎可以从共享表空间中的 doublewrite 中找到该页的一个副本, 将其复制到表空间文件, 再应用重做日志.
4. 自适应哈希索引
InnoDB 存储引擎会监控对表上各索引页的查询. 如果观察到建立哈希索引可以带来速度提升, 则建立哈希索引.
自适应哈希索引是通过缓冲池中的B+树建立的, 因此建立的速度很快, 而且不需要对整张表结构建立哈希索引.
InnoDB存储引擎会自动根据访问的频率和模式来自动的为某些热点页建立哈希索引.
哈希索引只能用来搜索等值查询.
自适应哈希索引不能人文干预.
5. 异步IO
InnoDB存储引擎 和大多数数据库一样,都是采用异步IO方式来操作磁盘的.
这些特性 为 InnoDB存储引擎带来更好的性能以及更高的可靠性.
文章来源于互联网:InnoDB存储引擎-核心特性
5bei.cn大模型教程网










