InnoDB存储引擎 随记

InnoDB

该存储引擎是第一个完整支持ACID事务的MySql存储引擎,其特点是行锁设计、支持MVCC、支持外键,提供一次性非锁定读,同时被设计用来最有效地利用以及使用内存和CPU

InnoDB体系结构

InnoDB存储引擎是多线程的模型,因此其后台有多个不同的后台

Master Thread
Master Thread是一个非常核心的后台线程,主要负责将缓冲池的数据异步刷新到磁盘,保证数据一致性,包括脏页的刷新、合并插入缓冲,undo页的回收等。

IO Thread
负责IO请求的回调处理。分别是write 、read、insert buffer 和log thread

Purge Thread
事务被提交后,其所使用的undo log可能不在需要,因此需要Purge Thread来回收已经使用并分配的undo页。
从InnoDB 1.2版本开始,InnoDB 支持多个Purge Thread ,这样做的目的是为了进一步加快undo页的回收。同时由于Purge Thread 需要离散地读取undo页,这样也能更进一步利用磁盘的随机读取性能

内存

缓冲池

InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。
缓冲池简单来说就是一块内存区域,通过内存的速度来弥补磁盘速度较慢对数据库的印象,在数据库进行读取页的操作,首先将磁盘读到的页存放在缓冲池中,这个过程称为将页“FIX”在缓冲池中。下一次再读相同的页时,首先判断该页是否在缓冲池中。若在缓冲池中,称该页在缓冲池中被命中,直接读取该页。否则,读取磁盘上的页。

对于数据库中页的修改操作,则首先修改在缓冲池中的页,然后再以一定的频率刷新到磁盘上这里需要注意的是,页从缓冲池刷新回磁盘的操作并不是在每次页发生更新时触发,而是通过一种称为Checkpoint 的机制刷新回磁盘。同样,这也是为了提高数据库的整体性能。综上所述,缓冲池的大小直接影响着数据库的整体性能。由于32位操作系统的限制,在该系统下最多将该值设置为3G此外用户可以打开操作系统的PAE选项来获得32位操作系统下最大64GB内存的支持。随着内存技术的不断成熟,其成本也在不断下降。单条8GB的内存变得非常普遍,而PC服务器已经能支持512GB的内存。因此为了让数据库使用更多的内存,强烈建议数据库服务器都采用64位的操作系统。

Innodb存储引擎LRU淘汰算法

在innodb存储引擎中,缓冲池中页的大小默认为16KB,同时使用LRU算法对缓冲池进行管理。稍有不同是InnoDB存储引擎对传统的LRU算法做了一些优化。在InnoDB 的存储引擎中,LRU列表中还加入了midpoint 位置。

新读取的页虽然是最新访问的页但并不是直接放在LRU首部,而是放入到LRU列表的midpoint位置。这个算法在innodb存储引擎下称为midpoint
insertion strategy 。在默认配置下,该位置在LRU列表的5/8处。midpoint 位置可由参数innodb
_old_blocks pct 控制。在innodb存储引擎中,把midpoint之后的列表称为old列表,之前的称为new列表。可以简单的理解为new列表中的页都是最为活跃的热点数据。

那为什么不采取朴素的LRU算法,直接将读取的页放入到LRU列表的首部呢?这是因为若直接将读取到的页放入到LRU的首部,那么某些SQL操作可能会使缓冲池中的页被刷新出,从而影响缓冲池的效率。常见的这类操作为索引或数据的扫描操作。这类操作需要访问表中的许多页,甚至是全部的页,而这些页通常来说又仅在这次查询操作中需要,并不是活跃的热点数据。如果页被放入LRU列表的首部,那么非常可能将所需要的热点数据页从LRU列表中移除,而在下一次需要读取该页时,InnoDB
存储引擎需要再次访问磁盘。为了解决这个问题,InnoDB 存储引擎引入了另一个参数来进一步管理LRU列表,这个参数是innodb_old
_blocks_time ,用于表示页读取到mid位置后需要等待多久才会被加入到LRU列表的热端。

猜你喜欢

转载自blog.csdn.net/itlijinping_zhang/article/details/115702713