为什么InnoDB不使用缓冲池而不使用mmap整个文件?

问题描述

InnoDB使用可配置大小的缓冲区bool来存储最近使用的页面(b + tree块)。

为什么不映射整个文件呢?是的,这不适用于已更改的页面,因为您想在将它们写回到目标位置之前将它们存储在双写缓冲区中。但是mmap允许内核管理页面的LRU,并避免了用户空间复制。同样,内核复制代码不使用向量指令(以避免将其寄存器存储在过程上下文中)。

但是,当页面未更改时,为什么不使用mmap读取页面并让内核管理它们在文件系统ram缓存中的缓存呢?因此,您只需要“自定义”用户空间缓存即可用于已更改的页面。

LMDB作者提到,他选择了mmap方法来避免将数据从fisystem缓存复制到用户空间并避免LRU的重新发明。

我缺少mmap的哪些关键缺点导致缓冲池方法?

解决方法

MMAP的缺点:

  • 并非所有操作系统都支持它( ahem Windows)

  • 粗锁定。很难让许多客户端同时访问文件。

  • 如果RDBMS引擎崩溃,则依靠操作系统来缓冲I / O写入会导致数据丢失的风险增加。需要使用日记文件系统,并非所有操作系统都支持该文件系统。

  • 只能将文件大小映射为虚拟内存地址空间的大小,因此在32位操作系统上,数据库文件限制为4GB(来自上述Roger Lipscombe的评论)。

MongoDB的早期版本尝试在主存储引擎(最早的MongoDB中唯一的存储引擎)中使用MMAP。从那时起,他们推出了其他存储引擎,特别是WiredTiger。这样可以更好地支持调优,在多核系统上提供更好的性能,支持加密和压缩,多文档事务等等。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...