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

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

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

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

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

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

什么是跳表

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

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

这里的缓存页面主要有

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 ,这里不建议调整,调整值的大小与数据考那个键的节省和写入的速度有关.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python可以使用redis-py库和pymongo库来操作Redis和MongoDB。 要使用Redis作为缓存,可以使用redis-py库。首先需要安装redis-py库,然后在Python代码中导入redis模块。接下来,可以使用redis模块的相关方法来与Redis进行交互。例如,可以使用set方法将数据缓存到Redis中,使用get方法从Redis中获取数据。此外,还可以使用expire方法为缓存设置过期时间,使用delete方法从Redis中删除缓存等。 要使用MongoDB作为主数据库,可以使用pymongo库。首先需要安装pymongo库,然后在Python代码中导入pymongo模块。接下来,可以使用pymongo模块的相关方法来与MongoDB进行交互。例如,可以使用insert_one或insert_many方法将数据插入到MongoDB中,使用find方法查询数据,使用update_one或update_many方法更新数据,使用delete_one或delete_many方法删除数据等。 在使用Redis和MongoDB的组合方式中,可以将经常被访问的数据缓存到Redis中,从而提高访问速度。当需要获取数据时,首先尝试从Redis中获取,如果不存在则从MongoDB中获取,并将获取的数据缓存到Redis中。同时,还可以通过设置合适的过期时间,以保证缓存的数据不会过时。 需要注意的是,在将数据缓存到Redis中时,应该根据实际需求选择适当的数据结构(如字符串、哈希、列表、有序集合等),以满足不同的缓存需求。在使用MongoDB作为主数据库时,需要根据实际情况设计合理的数据模型和索引,以支持高效的数据存储和查询操作。 总之,通过使用Python操作redis和mongodb,结合redis作为缓存mongodb作为主数据库,可以提高数据的读写效率和性能,并实现灵活可扩展的数据存储方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值