InnoDB存储引擎(一)
整体结构
内存池
- 维护线程/进程内部数据结构
- 缓存磁盘文件(cache)
- 对数据的更新或者新增操作,避免直接刷新磁盘
- 重做日志缓冲(redo log)
后台线程
- Master Hhread,将更新的数据(包括新增和被修改的数据)异步刷新到磁盘,维护内存池和磁盘中的数据的一致性。
- IO Thread分为Insert buffer Thread,log thread,read thread,write thread。
- purge thread,回收undo log
- Page cleaner thread,刷新脏页到磁盘(由master thread 独立出来的)
Write Ahead log:是指当事务提交上,先做重做日志,再修改页。满足事务中持久性要求。
Check Point:检查点技术,数据库系统为了缩短数据库发生宕机恢复所需的时间所采取的一种刷新脏页的方法。 检查点技术分为两种,sharp checkpoint和fuzzy checkpoint。sharp checkpoint用在数据库关机时,将所有的脏数据全部刷新到磁盘。fuzzy checkpoint是按照一定的策略定时部分的刷新脏页数据,较为复杂,此处不做介绍。
InnoDB关键特性
- 插入缓冲(性能提升)
- Insert Buffer 当新增数据并且存在非聚焦索引时,会有对非聚焦索引页的离散读。当出现这种情况时,mysql会先判断当前的非聚焦索引页是否存在于缓冲池中,如果存在则直接修改或者新增。如果不存在缓冲池中,则会先放到缓冲池中(类似于脏页),再以一定的频率merge之后,插入到实际的非聚焦索引页。
- Change Buffer 插入缓冲的升级,用在删除或者更新的情况下。在删除时,并不会对非聚焦索引全部删除。在更新是,也不马上更新非聚焦索引。
- 以上两种优化手段,适用于 1. 存在非聚焦索引 2. 非聚焦索引不唯一。
- 两次写(可靠性)
- 对某页写回磁盘的过程中,如果出现宕机,并且导致页破坏(无法使用重做日志)。会出现数据丢失的情况。针对此问题,mysql首先会将所有需要写入的页(2MB)全部刷回到共享表空间中(没有离散写),再将更新的数据写入到各自的表空间中。
- 对某页写回磁盘的过程中,如果出现宕机,并且导致页破坏(无法使用重做日志)。会出现数据丢失的情况。针对此问题,mysql首先会将所有需要写入的页(2MB)全部刷回到共享表空间中(没有离散写),再将更新的数据写入到各自的表空间中。
- 自适应哈希索引(性能提升)
- InnoDB查找耗时主要在于B+树的查找,通过使用哈希这种数据结构,将查询参数(Key)和值(位置)对应来减少查找的耗时。
- 异步IO(性能提升)
- 异步IO在对磁盘进行写入时,是非阻塞式的,能对多个查询或者插入操作进行merge,以减少实际的IO次数。
- 刷新邻接页(性能提升)
- 在刷新脏页时,会检查该页所在所在区的所有页,连同刷新。