假设我要用c ++编写自己的数据库,并假设我将使用二叉树或哈希图作为基础数据结构。我将如何处理对此数据结构的更新?
1)我应该首先创建二进制树,然后以某种方式将其持久化到磁盘上吗?每次必须更新数据时,我都需要打开此文件并进行更新吗?那不是一个昂贵的手术吗?
2)有没有一种方法可以直接在二叉树上工作而不将其加载到内存中,然后再次持久化?
3)SQLite和Mysql如何处理它?</ p>
4)我的主要问题是,数据库如何保存大量数据并在不每次打开和关闭文件的情况下同时对其进行更新。
答案 0 :(得分:0)
数据库将磁盘或文件视为一种大型设备,并管理M路平衡树中的块。他们在这些块中插入/更新/删除记录,然后再次将脏块刷新到磁盘。它们管理空闲块的分配表,因此不需要在每次访问时都重写数据库。由于RAM内存昂贵但速度很快,因此页面将保留在RAM缓存中。单独的索引(单独的文件或仅块)管理基于密钥的快速访问。块通常是基础文件系统的本机分配大小(例如,群集大小)。保留还原/重做日志的原子性。等
还有更多要说的,这个问题实际上属于Computer Science Stack Exchange。有关更多信息,请阅读Horowitz&Sahni,“数据结构基础”,第496页。
关于您的问题:
您只需打开一次,并在数据库管理器运行时保持打开状态。您可以根据需要分配存储空间,并如上所述维护M路树。
是的。您将读取保留在缓存中的块。
和4:请参见上文。
答案 1 :(得分:0)
通常,您不会执行文件I / O访问数据。使用mmap
将数据映射到进程的虚拟地址空间,并让OS块缓存负责读取和写入。