你的位置:首页 > 软件开发 > 数据库 > innoDB源码阅读笔记

innoDB源码阅读笔记

发布时间:2016-06-09 23:00:09
最开始学Oracle的时候,有个概念叫SGA和PGA,是非常重要的概念,其实就是内存中的缓冲池。InnoDB的设计类似于Oracle,也会在内存中开辟一片缓冲池。众所周知,CPU的速度和磁盘的IO速度相差可以用鸿沟来形容,因此聪明的前辈们使用了内存这个ROM来弥补这道鸿沟,那么数 ...

    最开始学Oracle的时候,有个概念叫SGA和PGA,是非常重要的概念,其实就是内存中的缓冲池。InnoDB的设计类似于Oracle,也会在内存中开辟一片缓冲池。众所周知,CPU的速度和磁盘的IO速度相差可以用鸿沟来形容,因此聪明的前辈们使用了内存这个ROM来弥补这道鸿沟,那么数据库的设计者们也继承了这个优良的设计理念,在内存中开辟了一片区域,存放缓冲数据,提高数据库效率。

    可以将磁盘的缓冲区理解成一个简单的模型--由数据块组成的一片区域,数据块(block/page)默认大小是16KB。那么现在可以画出一个好理解的模型出来了:

innoDB源码阅读笔记

      这里的每一个格子都代表一个page。在代码里这个区域有两个关键的数据结构:buf_pool_struct和buf_block_struct。其中buf_pool_struct是缓冲池的数据结构,buf_block_struct是数据块的数据结构。

      对于缓冲池的管理,InnoDB维护了一个free链表,该链表中记录了没有被使用的内存块,每次申请数据块都是要从free链表中取。但是,一般来说数据库的缓冲池都会比实际数据量小,因此缓冲池总有用完的一天,也就是说free链表的所有页都被分配完了,这个时候另一个数据结构开始发挥作用--LRU链表。

      LRU是一个经典的算法,全称是最近最少使用(Lastest Least Used)。使用最频繁的页总是在链表的前面,而最后的页就是要被释放掉的页。然而InnoDB没有采用这种大路货,而是另辟蹊径的搞了个改进版的LRU,有人管他叫做midpoint LRU,是这样的:

      innoDB源码阅读笔记

     InnoDB的主要改进点在于每次将磁盘上读出的数据不是直接放到链表的头部,而是放在链表的3/8处(该值可配置),只有在下次访问该页时,才会将该页移动到链表头部。这样改进的原因在《MySQL内核--InnoDB存储引擎》一书中有论述(p250)。这个链表就被分为了两部分,midpoint前叫做young list,midpoint后叫做old list。链表尾部的数据块会被释放掉,buf_LRU_search_and_free_block函数会完成这个操作:

     

  block = UT_LIST_GET_LAST(buf_pool->LRU);  while (block != NULL) {    ut_a(block->in_LRU_list);    mutex_enter(&block->mutex);    freed = buf_LRU_free_block(block);    mutex_exit(&block->mutex);    if (freed) {      break;    }

原标题:innoDB源码阅读笔记

关键词:

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

可能感兴趣文章

我的浏览记录