「这是我参与 2022 首次更文挑战的第 22 天,活动详情查看:2022 首次更文挑战」
唯君子为能通天下之志也。
前言
前文讲述了 mysql 数据库 InnoDB 引擎的后台工作线程,在面试和工作中我们经常会遇到数据库引擎的问题,那么本文继续分享 InnoDB 引擎的关键特性。
InnoDB 关键特性
InnoDB 引擎的关键特性有:
- 1 插入缓存(Insert Buffer)
- 2 两次写(Double Write)
- 3 自适应 hash 索引(Adaptive Hash Index)
- 4 异步 IO(Async IO)
- 5 刷新临接页(Flush Neighbor Page)
这些特性带来了更好的性能以及可靠性。
插入缓存
插入缓存分为两个部分,一个是 insert buffer ,另一个是 change buffer。
insert buffer
在 InnoDB 存储引擎中,主键是一行数据的唯一标识符。通常应用程序在写入数据库数据时是暗账主键递增的顺讯进行插入的。在插入聚集索引一般是顺序插入,不需要磁盘的随机读取。对于主键设置自增属性的,如果插入数据为 null ,则该主键值会自动增长。
InnoDB 存储引擎开创性的地设计了 Insert Buffer ,对于非聚集索引的插入或者更新操作,不是每一次的插入或者插入索引页中,而是先判断插入的非聚集索引页是否在缓冲池中,若存在则插入,若不存在先存放在一个 Insert Buffer 对象中。后续再由 Master Thread 异步线程将 Insert Buffer 和辅助索引页子节点进行合并操作,这是通常能将多个插入操作合并到一个操作中,这样就大大提高了非聚集索引的插入性能。但是对于 InsertBuffer 的使用需要满足以下连个条件:
- 1 索引是辅助索引。
- 2 索引不是唯一的。
满足以上的两个条件时, InnoDB 就会使用 Insert Buffer,这样就能提高插入操作的性能。当应用程序进行大量的插入操作时就会涉及不唯一的非聚集索引,也就是使用了 Insert Buffer。当数据库服务发生了宕机,这时就会有大量的 Insert Buffer 没有合并到实际的非聚集索引中去,这样在进行恢复时就会花费大量的时间。
如上图所示,seg size 表示了当前的 Insert Buffer 大小,即 2552 * 16KB,大约是 39MB, free list len 代表了空闲列表的长度,size 代表了已经合并记录页的数量,merges 代表合并的次数,也就是实际读取页的次数。
在写密集的情况下,插入缓存会占用过多的缓冲池内存(innodb_buffer_pool),默认最大可以占用的空间比例为 50%。
总结
在本文中简单介绍了 InnoDB 的关键特性,主要涉及插入缓存中的部分内容,插入缓存主要应用于非唯一的辅助索引插入,后续的内容中会接着介绍插入缓存中的其它内容。