三大存储特点:哈希缓存,双写缓冲区,buffer pool。
1. 磁盘结构
最小的磁盘单元是“页”。
页
一个页的大小是16k。里面可以存储多个行,如果一行数据太大(超过786字节),会被放在多个页里。
区
一个区有64个页。一个区的大小相当于就是64*16k=1m。设计区的目的是让相邻的页的物理位置相邻。
组
一个组有256个区。每个组里有两个特殊的区(在系统空间),innoDB在写入这个组的时候,会先往这两个区写入,这两个区就叫双写缓冲区(double write buffer)。
设置双写缓冲区的目的:
- 增加数据库的可靠性。防止在写入部分数据的时候断电造成数据损坏。双写缓冲区必须完整写入后,才会把数据写入到数据文件的对应位置。如果写入数据文件的时候断电,在重新启动后,数据库就可以根据双写缓冲区的数据进行恢复。
- 提高写入磁盘的速度。在写入数据时,先将数据写入双写缓冲区(磁盘,由于这两个区在物理上是连续的,它俩也是紧挨着的,写入是顺序写,速度很快),再将数据写入到数据文件(磁盘,这次可能就是随机写了)的适当位置。
段
一个段有多个组。一棵B+树一般有3个段,一个叶子节点段,一个非叶子节点段,一个回滚段。
2. buffer pool(缓冲池)
double write buffer(双写缓冲区)是为了把内存里的数据写入磁盘时高效、可靠地使用,它是硬盘上的区域;
buffer pool(缓冲池)是为了把磁盘里的数据加载到内存时高效地使用,它是内存上的区域。
buffer pool大小可以配置,在数据库启动时就会申请一片连续的内存作为buffer pool。
buffer pool里主要是缓冲加载进来的数据页(每个数据页大小也是16k),以及为了管理这个buffer pool的一些链表和哈希表。
- free链表:存的是缓冲池里空闲的页。
- flush链表:存的是缓冲池里修改过的页。
- 哈希表:存的是缓冲池里被占用的页。用于快速访问。
- LRU链表:存的是缓存池里被占用的页。在缓冲池空间不够的时候,用于淘汰一些不常用的页。