首页 > 解决方案 > 磁盘数据库如何在文件系统级别处理文件读写?

问题描述

假设我要用 C++ 编写自己的数据库,并假设我将使用二叉树或哈希映射作为底层数据结构。我将如何处理对此数据结构的更新?

1)我应该先创建二叉树,然后以某种方式将其保存到磁盘上吗?每次必须更新数据时,我都需要打开这个文件并更新它?那不是一个昂贵的操作吗?

2)有没有办法直接处理二叉树而不将其加载到内存中然后再次持久化?

3)SQLite和Mysql是如何处理的?

4)我的主要问题是,数据库如何保存大量数据并同时对其进行更新,而无需每次打开和关闭文件。

标签: c++cdatabasesqlitefilesystems

解决方案


数据库将磁盘或文件视为一个大块设备,并在 M-way Balanced Trees 中管理块。他们在这些块中插入/更新/删除记录,并再次将脏块刷新到磁盘。它们管理空闲块的分配表,因此不需要在每次访问时重写数据库。由于 RAM 内存昂贵但速度快,因此页面保存在 RAM 缓存中。单独的索引(单独的文件或只是块)基于键管理快速访问。块通常是底层文件系统的本机分配大小(例如集群大小)。为原子性维护撤消/重做日志。等等

还有更多要说的,这个问题实际上属于计算机科学堆栈交换。如需更多信息,请阅读 Horowitz 和 Sahni,“数据结构基础”,第 496 页。

至于你的问题:

  1. 您打开它一次并在数据库管理器运行时保持打开状态。您可以根据需要分配存储空间并维护如上所述的 M 路树。

  2. 是的。您读取保存在缓存中的块。

  3. 和 4:见上文。


推荐阅读