乐趣区

关于mysql:MySQLInnoDB

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 之后的重做日志进行复原。

退出移动版