InnoDB 是第一个残缺反对 ACID 事务的 MySQL 存储引擎,其特点是 行锁设计
反对 MVCC、反对外键 、 提供一致性非锁定读。
缓冲池
缓冲池简略来说就是一块内存区域,通过内存的速度来补救磁盘速度较慢对数据库性能的影响。
在数据库中进行读取页的操作,首先将从磁盘读到的页寄存在缓冲池中,这个过程称为将页“FIX”在缓冲池中。下一次再读取雷同的页时,首先判断该页是否在缓冲池中。若在缓冲池中,称该页在缓冲池中被命中,间接读取该页。
对于数据库中页的批改操作,则首先批改在缓冲池中的页,而后再以肯定的频率刷新到磁盘上。
缓冲池的大小,是通过参数
innodb_buffer_pool_size
来设置的。
缓冲池中缓存的数据页类型有:索引页 、 数据页 、undo 页、 插入缓存 、 自适应哈希索引 、InnoDB 存储的锁信息、 数据字典信息 等。
通常来说,数据库中的缓冲池是通过 LRU(Latest Recent Used)算法来进行治理的。即最频繁应用的页在 LRU 列表的前端,而起码应用的页在 LRU 列表的尾端。当缓冲池不能寄存新读取到的页时,将首先开释 LRU 列表中尾端的页。
但采纳这种算法时,会导致一个问题:当一次查问操作须要拜访表中许多页时,依据缓存的机制,会将这些页放到缓存 LRU 的首部,那么,其余操作频繁的页会被刷出,从而影响缓冲池的效率。
为了解决这个问题,InnoDB 的 LRU 列表进行了优化,退出了 midpoint 地位。
新读取到的页,尽管是新拜访的页,但并不是间接放到缓存列表的首部,而是放入到缓存列表的 midpoint 地位。
midpoint 是通过
innodb_old_blocks_pct
参数来配置的。
在 InnoDB 存储引擎中,把 midpoint 之后的列表称为 old 列表,之前的列表称为 new 列表。
同时,InnoDB 引入了另一个参数 —— innodb_old_blocks_time
,用来示意页读取到 midpoint 地位后,须要期待多久才会被退出到 LRU 列表的 new 列表中。
在理论的利用过程中,能够通过命令 show engine innodb status
,变量 Buffer pool hit rate
示意缓冲池的命中率。这个比率越大,阐明缓冲池运行状态越好,当过低时,须要察看是否因为全表扫描引起的缓冲池被净化。
须要留神,
show engine innodb status
显示的不是以后的状态,而是过来某个工夫范畴内 InnoDB 的状态。
checkpoint
InnoDB 在批改数据时,如果该数据在缓存中,会间接批改缓存中的数据,所以会呈现缓存中的数据和磁盘中的数据不统一的景象。
在缓存中的页被批改后,称该页为脏页(dirty page),即缓冲池中的页和磁盘上的页的数据产生了不统一。
当产生脏页时,就须要一种机制来同步脏页到磁盘。这时就会通过 checkpoint 机制来将脏页刷新回磁盘。
当数据库产生宕机时,数据库不须要重做所有的日志,因为 Checkpoint 之前的页都曾经刷新回磁盘。故数据库只须要对 Checkpoint 之后的重做日志进行复原。