Mongodb   缓存页结构, 为什么我那么快 (1)_mysql

MONGODB 数据库写入和并发的速度,绝非是传统数据库可以比拟的,但到底为什么插入的速度这么快,和他的数据库引擎 wiredTiger 有关,那么就看看MONGODB wiredTiger 的设计。

Mongodb   缓存页结构, 为什么我那么快 (1)_python_02

MONGODB 的数据库引擎WiredTiger, 使用PAGE 页的方式,来存储数据,但是磁盘和内存的页面的结构是不一致的, 内存的页面的结构为B-TREE 结构。

Mongodb   缓存页结构, 为什么我那么快 (1)_java_03

在调用数据的过程中,数据先通过BTREE 索引找到对应的LEAF PAGE 然后在PAGE 内通过二分查找的方式来提取数据。这里根据官方给出的说明 internal page 的大小在 4kb , Leaf page 的大小在 32KB

在leaf page 中存在 dirty leaf page 区域,在插入数据后脏页分为两种,插入数据和更新与删除数据,删除数据与更新是一个类型,删除属于更新标志位.

Mongodb   缓存页结构, 为什么我那么快 (1)_python_04

当在数据库中存在脏页后,通过checkpoint 来将脏页刷新到磁盘,在刷新时避免影响当前的业务,内存中会将需要刷新页面以及他的上层节点和根节点产生一个新的内存的 COPY , 继续工作,老的脏页会进行刷新的操作. 在内存中通过跳表来安排即将通过内存刷新到磁盘的信息与位置.

Mongodb   缓存页结构, 为什么我那么快 (1)_数据库_05

什么是跳表

https://www.jianshu.com/p/9d8296562806

除定时刷新以外,缓存中的脏页超过阀值,都会触发刷新的工作.

Mongodb   缓存页结构, 为什么我那么快 (1)_数据库_06

这里的缓存页面主要有

1  memory_page_max 

在内存中的最大的内存页面的大小, 首先这个页面定义成整型的页面,默认值为5MB,这个值主要的作用在于,当对于内存的页面的大小设置,这个页面的大小的设置在于整体内存页面在内存中的申请和分割的原则, 值如果大的情况下,在大量数据写入和频繁更新的情况下,是有利的,内存的页面不会频繁的被执行申请,造成在申请内存页面的时候,会产生卡顿的情况.

2  internal_page_max

这个页面主要存储的内容是每一个leaf page的地址,也是真实每个每个页面的地址.通过internal page中存储的页的地址来找到实际的存储数据的页面. 如果调整internal page 的大小可以控制查找数据的深度,数据量过大会并且internal_page_max 过小会增加查找leaf page的深度, 但过大的internal page 会在本身中进行二分查询leaf page 产生性能问题.

3  leaf_page_max 

leaf 页面是存储实际数据的页面,默认值32KB, 这个是内存中存储数据的页面,调整这个页面的大小可以扩大每个PAGE 存储的数据的容量. 但任何事情都是双刃剑,大型的LEAF PAGE 会提高从 internal_page 中扫描数据的速度,但会加大在本页内进行 二分查找的时间.  同时如果使用SATA 磁盘的情况下,调整leaf_page 的大小有助于顺序数据的读取的速度.

4  allocation_size

分配文件的写入的单元,默认为4KB ,这里不建议调整,调整值的大小与数据考那个键的节省和写入的速度有关.

Mongodb   缓存页结构, 为什么我那么快 (1)_python_07