试读《MySQL内核:InnoDB存储引擎 卷1》有感

 

   --------对于是学习我喜欢寻根问底

     对于内存与储存,一直很感兴趣,特别是数据库的存储; 看到InnoDB存储引擎,很自然的一动作,下载然后阅读了,一口气就看完了试读部分,有些急切想知道接下来的内容。试读的内容为:

    第一章讲了InnoDB的历史与InnoDB的规范,由Heikki Tuuri创始,再到与MySQL AB公司合作,Inno DB开源,最后Oracle Innobase公司与MySQL都收购了的曲折历史;接着就InnoDB的一些代码规范。

    第二章讲述了InnoDB内存管理及所用到数据结构。InnoDB主要采用内存堆的方式进行内存的管理,通过动态分配与缓冲池分配两种方式的内存申请,其中动态分配是从操作系统分配内存空间;缓冲池分配是从缓冲池分配内存空间。

    InnoDB内存管理分为三层,从高层到底层分别为:内存堆层,缓冲池与通用内存池,系统内存。对于内存堆层实质就是栈,最晚分配的内存最早对它进行释放;对于InnoDBd存储引擎有三种类型,分别为MEN_HEAP_DYNAMIC,主要是对内存调用通过内存池接口申请;MEN_HEAP_BUFFER主要对从缓冲池申请;MEN_HEAP_BTR_SEARCHMEN_HEAP_BUFFER的子类,在适应的哈希中使用。

    中间层通用内存池,为了有效地解决内存中的碎片问题,主要是采用了伙伴系统算法。内存池中分成64组内存块,采用数组free_list来存储,内存块的大小都是2的幂次方。文中的1M内存的例子把内存分配的过程与内存释放过程清晰可见(如下图)。初始化1M内存,首先申请100K1M内存进行一个512k,256k,128k,128K分块,最终返回一块128k内存给申请者。请求64k时,还会对最小的块继续分块,最小可以到120次方);当请求256k时,因为链表中没有空闲的256km内存,会向更大内存块分配。对于释放,当两个块的大小相同与两个块的物理地址连续时,就会进行合并,形成更大的内存块,这个让人想起现在最流行的1024那个游戏^_^

试读《MySQL内核:InnoDB存储引擎 卷1》有感_第1张图片
        
最后介绍InnoDB采用哈希表(哈希算法,哈希表的数据结构)及双链表(内存双链表及磁盘双链表)一些数据结构;及动态数组与排序。

总的来说,从试读的几章看来,作者的思路比较清晰,可对于InnoDB的内存管理原理性的分析只是点到即止,期待接下来的各章节对这些原理的分析及在InnoDB内存管理中应用。

你可能感兴趣的:(读后感)