【问题标题】:how to store index in disk blocks consistently如何在磁盘块中一致地存储索引
【发布时间】:2012-08-17 19:04:16
【问题描述】:

我正在用 C 语言为 Linux 构建一个数据库引擎,我需要实现索引。 考虑这样一个简单的双链表索引:

struct node_t {
   void *prev;
   void *next;
   long  data;
};

对于永久存储,我必须将此结构转换为磁盘块,例如:

struct node_on_disk_t {
    size_t prev_disk_block;
    short  prev_disk_offset;
    size_t next_disk_block;
    short  next_disk_offset;
    long   data;
};

现在,当我插入一条记录时,也必须将一个条目添加到索引中。如果索引只有几个元素,我可以将它一致地存储在 1 个磁盘块上,因为 1 个块的 write() 是原子的。但是,如果列表完全填满了第一个块,则必须在插入时添加另一个块,并且必须在两个块上更新指针。但问题是,只能原子写入 1 个块。所以,我的问题是如何一致地存储这种结构?

这可以在没有事务日志的情况下完成吗?因为我可以先将操作的描述存储在另一个磁盘块上(某种事务日志),更新索引的指针,然后删除操作的描述,但这必须在 3 个 write()s 中完成,太慢了

【问题讨论】:

  • 本题与[database-design]无关。请删除此标签。
  • 顺便说一句:您确定这就是您要实现索引的方式吗?数据库索引通常旨在提高访问时间。双向链表并不是实现这一目标的最佳方式。
  • @ArjunShankar 是的,我确定。当用户在应用程序中点击“下一个”或“上一个”按钮时,他只想查看下一个或上一个数据,因此不需要读取完整的索引,因为它可能有数百万条记录
  • 这不是database index 的真正用途,但没关系。
  • @ArjunShankar 好的,那么当列表长度超过 1 个扇区时如何存储双链表呢?

标签: c database database-design


【解决方案1】:

有两种常见的策略:

  1. 事务记录
  2. 写时复制

后者的工作原理是始终将新的和更改的数据复制到新扇区,并在设置新映像后,使用一个原子扇区写入链接它。

不幸的是,我看不出这对双链表有什么作用。它适用于单链表。

【讨论】:

    猜你喜欢
    • 2021-08-29
    • 1970-01-01
    • 2012-05-13
    • 1970-01-01
    • 2011-06-08
    • 1970-01-01
    • 2015-11-07
    • 2023-03-09
    • 2014-06-10
    相关资源
    最近更新 更多