《MySQL内核:InnoDB存储引擎 卷1》从源码层次分析了InnoDB的体系结构、原理、工作机制等,结合实践案例,对我们想深入学习MySQL innoDB 内核原理来说,是不可多得的好书。
目前MySQL InnoDB 在各大互联网公司都得到了应用,如淘宝、网易、百度、google等。第1章介绍了InnoDB的发展历史及源码的基本结构。Innobase发展,同Msyql合作开源InnoDB存储引擎;到mysql、innobase都被Oracle收购,重新结合,一波三折。
思考:Mysql InnoDB引擎同 MyISAM 的比较
MyISAM是非事务安全型,而InnoDB是事务安全型。
MyISAM锁的粒度是表级,而InnoDB支持行级锁定。
MyISAM支持全文类型索引,而InnoDB不支持全文索引。
。。。。
InnoDB存储引擎代码模块划分:
基础:
FileMananger模块:对文件操作,如读写、异步I/O等
ConcurrencyManager:并发,封装引擎内部使用的Mutex、Latch等
Common utility:基本算法和数据结构
核心:
索引、事务、LOCK、缓存、日志、存储等模块
InnoDB存储引擎以嵌入方式同Mysql结合。
第2章 介绍了InnoDB内存管理系统的基本实现及数据结构。采用内存堆的方式关联内存对象。通过一次性分配大块内存来减少内存申请(malloc)、释放(free)带来的开销。
分为缓冲池分配(从缓冲池中分配内存)、动态分配(直接系统分配:malloc函数)。
内存管理的层次结构:
内存堆层
缓冲层、通用内存池
系统内存
内存堆层
内存堆类似stack,通过增加内存块增加空间,从stack top位置释放相应内存块。内存块之间以链表的形式管理。内存块结构:men_block_info_t(见书P9)
内存堆中各个内存块组织形式:(图02)
内存堆分类:
内存堆创建函数:men_heap_create_func,通过不同分配方式(3种)初始化堆内存大小、指针。
通用内存池
Men_common_pool对象,数据结构:men_pool_struct,包括内存池分配的起始位置、大小size、已分配大小reserved;内存单元链表节点数组free_list。
通用内存池通过free_list[64]、men_area_struct组成伙伴系统。内存池分成64个内存区链表,以2^n(n<=64)分配内存。文中通过实例进行了明确的讲解:
安规则将内存分割,再看申请空间大小进行更小分块。释放则将相连的空闲空间进行合并。
基本算法结构
本文还对基本的算法结构(哈希算法、双向链表(基于内存、磁盘)、动态数组),基本排序实现做了相应的介绍。
双链表应用场景及区别:
内存双链表:缓冲池、事务、lock、文件管理等。用于内存中快速定位
磁盘双链表:表空间管理、事务管理、B树模块;用于建立磁盘中数据结构之间的关系。
从试读文章、目录结构来看,本书写的还是相当不错,内容比较深入浅出,直到阅读!