
数据库
文章平均质量分 93
Achilles.Wang
勿在浮沙筑高台
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
数据库的并发控制
但对于数据库而言,客户端可以以任意顺序获取锁,因此数据库必须检测并解决死锁,这是一个图问题。在乐观并发控制中,事务在冲突时无法继续,这对应用程序来说并不友好,因为它们只能不断重试。涉及I/O操作,我们可以通过在等待I/O时释放锁来进一步优化,以允许其他事务进入,并让只读事务退出。然而,单个写者仍然不足,因为事务的生命周期由客户端控制,可能任意延长。在现实中,这些步骤可以并行运行,因此需要序列化共享的KV结构。这种方法的用处有限,因为写者之间没有并发能力,且长时间运行的事务会导致读者和写者互相阻塞。原创 2025-05-05 22:13:42 · 857 阅读 · 0 评论 -
数据库的原子事务
简单的做法是一次迭代并逐个删除键,但这会将整个表读入内存并在删除前反复更新节点,做了一些无用的工作。在我们的案例中,所有内容使用单一的B+树,我们可以实现一个范围删除操作,无需查看即可释放具有特定范围的所有叶节点。:在任何排序的数据中,邻近的键可能共享一个公共前缀。:写时复制在一次更新中从叶节点到根节点复制节点,这对于多键更新来说不是最优的,因为中间树的节点在一个事务内分配、更新一次然后被删除。另一种方法是通过日志实现原子性,在写时复制树中,更新由根指针捕获,而在原地更新中,则需要日志来捕获更新。原创 2025-05-05 22:11:19 · 965 阅读 · 0 评论 -
数据库的二级索引
行和列作为KV对。范围查询B+树迭代器。保持顺序的编码。二级索引索引选择。需要一个事务性接口。原创 2025-05-05 22:08:43 · 912 阅读 · 0 评论 -
于键值(KV)的表
const (TYPE_BYTES = 1 // 字符串(任意字节)TYPE_INT64 = 2 // 整数;64位有符号TYPE_BYTES表示字符串类型,可以存储任意字节。TYPE_INT64表示整数类型,使用64位有符号整数。// 用户定义的部分Name string // 表名Types []uint32 // 列类型Cols []string // 列名PKeys int // 主键列的数量// 前 `PKeys` 列是主键// 不同表的自动分配的 B 树键前缀。原创 2025-04-28 00:04:44 · 745 阅读 · 0 评论 -
空闲列表:回收和再利用
高效的内存管理:自由列表能够自我维护,并且支持快速分配和释放页面。与写时复制的兼容性:通过追加写入的方式避免覆盖数据,减少了崩溃恢复的复杂性。灵活性:可以选择外部链表或嵌入式链表,根据性能和存储需求进行权衡。这种设计为数据库系统中的磁盘空间管理提供了一种优雅的解决方案。在这一节中,我们详细讨论了自由列表(Free List)的实现方法。自由列表是一种用于管理未使用页面的数据结构,它通过链表的形式组织页面编号,并支持高效的分配和回收操作。以下是对自由列表实现的逐步分析和总结。自由列表接口设计。原创 2025-04-24 23:34:01 · 866 阅读 · 0 评论 -
仅追加KV数据库
在本章中,我们将创建一个基于文件的键值存储(KV Store),其核心是一个**写时复制(Copy-on-Write, CoW)B+ 树**。这种设计的目标是实现数据的持久性和原子性。原创 2025-04-23 00:12:30 · 979 阅读 · 0 评论 -
B+树删除和测试
通过实现合并逻辑,我们可以优化 B+ 树的存储空间利用率。原创 2025-04-20 22:46:58 · 955 阅读 · 0 评论 -
B树的异常恢复
叶节点存储实际数据所有的实际数据都存储在叶节点中,这使得查询路径更加一致和简单。内部节点仅存储引导键内部节点的键用于划分子树的范围,帮助快速定位目标数据所在的叶节点。高度平衡B+树的高度始终保持平衡,确保查找、插入和删除操作的时间复杂度为Ο(log 𝑁)。高效的范围查询由于所有叶节点通过指针链接在一起,范围查询变得非常高效。例如,查询[4, 9)范围内的所有数据时,只需遍历相关的叶节点。空间利用率高每个节点可以存储多个键和子节点,减少了树的高度,从而降低了磁盘访问次数。扩展B树。原创 2025-04-20 21:56:47 · 994 阅读 · 0 评论 -
数据库基础-B+树
日志结构存储(如LSM-tree)通过合并操作摊销了更新成本,并通过多级结构进一步优化了写放大效应。高效的写入性能:更新被缓冲在小文件中,避免频繁重写整个数据集。可控的写放大效应:通过多级合并,减少不必要的磁盘写入。灵活性:可以根据具体应用场景调整层级数量,权衡写放大效应和查询性能。B+树B+树适用于需要频繁更新的场景,但在磁盘上的更新效率较低,并且空间复用的问题需要额外处理。LSM-treeLSM-tree 解决了许多上一章提到的挑战,例如如何高效更新基于磁盘的数据结构以及如何复用空间。原创 2025-04-19 23:00:38 · 971 阅读 · 0 评论 -
数据库的基本原则
SQL几乎成为了数据库的代名词,但它实际上只是数据库的一个用户界面,并不是数据库的核心。通过KV接口,你可以获取、设置和删除单个键值对,更重要的是,可以以排序顺序列出一系列键。为了实现持久性,可以使用。手机使用SQLite而非其他格式(如JSON)存储数据的原因在于,数据库系统提供了更高级的数据完整性和可靠性保证,尤其是在处理异常情况时。:这是一种常用的组织和存储数据的方式,特别适合于磁盘上的数据结构。以下是一些关键的原则,它们构成了数据库系统的基础,并且可以帮助你通过实践来学习如何构建一个简单的数据库。原创 2025-04-16 00:03:08 · 677 阅读 · 0 评论