首页 > 其他分享 >实现一个简单的Database11(译文)

实现一个简单的Database11(译文)

时间:2023-03-09 09:35:49浏览次数:48  
标签:node index key child GreatSQL Database11 num 译文 简单

  • GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。
  • GreatSQL是MySQL的国产分支版本,使用上与MySQL一致。
  • 作者: 花家舍
  • 文章来源:GreatSQL社区原创

前文回顾


译注:cstack在github维护了一个简单的、类似sqlite的数据库实现,通过这个简单的项目,可以很好的理解数据库是如何运行的。本文是第十一篇,主要是实现递归搜索B-Tree

Part 11 递归搜索B-Tree

上次我们在插入第15行数据报错的时候结束:

db > insert 15 user15 [email protected]
Need to implement searching an internal node

首先,使用一个新的函数调用替换埋桩的代码。

if (get_node_type(root_node) == NODE_LEAF) {
  return leaf_node_find(table, root_page_num, key);
} else {
-    printf("Need to implement searching an internal node\n");
-    exit(EXIT_FAILURE);
+    return internal_node_find(table, root_page_num, key);
}
}

这个函数会执行二叉搜索来查找子节点是否会包含给定的 Key。请记住,这些指向右子节点的 Key 都是他们指向的子节点中包含的最大 Key 。

img84576105040

three-level btree

所以我们的二叉搜索比较查找的 Key 和指向右边子节点的的指针。

+Cursor* internal_node_find(Table* table, uint32_t page_num, uint32_t key) {
+  void* node = get_page(table->pager, page_num);
+  uint32_t num_keys = *internal_node_num_keys(node);
+
+  /* Binary search to find index of child to search */
+  uint32_t min_index = 0;
+  uint32_t max_index = num_keys; /* there is one more child than key */
+
+  while (min_index != max_index) {
+    uint32_t index = (min_index + max_index) / 2;
+    uint32_t key_to_right = *internal_node_key(node, index);
+    if (key_to_right >= key) {
+      max_index = index;
+    } else {
+      min_index = index + 1;
+    }
+  }

另请记住,内部节点的子节点可以是叶节点,也可以是内部节点。在我们查找到正确的子节点后,会在节点上调用适合的搜索函数:

+  uint32_t child_num = *internal_node_child(node, min_index);
+  void* child = get_page(table->pager, child_num);
+  switch (get_node_type(child)) {
+    case NODE_LEAF:
+      return leaf_node_find(table, child_num, key);
+    case NODE_INTERNAL:
+      return internal_node_find(table, child_num, key);
+  }
+}

测试

现在向一个多节点btree插入 key 不再会导致报错结果。所以我们可以更新我们的测例:

"    - 12",
"    - 13",
"    - 14",
-      "db > Need to implement searching an internal node",
+      "db > Executed.",
+      "db > ",
])
end

我觉得现在是反思一下我们的另一个测试的时候了。也就是尝试插入1400行数据。仍然会报错,但是报错信息变成新的其他报错。现在,当程序 crash 的时候,我们的测试不能很好的处理这种报错。如果发生这种报错情况,到目前为止我们只使用获得的输出。

raw_output = nil
IO.popen("./db test.db", "r+") do |pipe|
  commands.each do |command|
-        pipe.puts command
+        begin
+          pipe.puts command
+        rescue Errno::EPIPE
+          break
+        end
  end

  pipe.close_write

下面显示出了我们在测试插入1400行时输出的报错:

end
script << ".exit"
result = run_script(script)
-    expect(result[-2]).to eq('db > Error: Table full.')
+    expect(result.last(2)).to match_array([
+      "db > Executed.",
+      "db > Need to implement updating parent after split",
+    ])
end

看起来这是我们待办事项列表中的下一个!


Enjoy GreatSQL

标签:node,index,key,child,GreatSQL,Database11,num,译文,简单
From: https://www.cnblogs.com/greatsql/p/17197096.html

相关文章

  • 路飞项目day_10 redis 列表 hash 通用 管道 celery简单操作
    目录今日内容详细一、redis之列表二、redis之hash三、redis其他操作四、redis管道五、django中使用redis六、celery介绍和安装七、celery快速使用八、celery包结构今日内......
  • (2.7)简单插入排序
    文章目录​​1.插入排序的思想​​​​2.插入排序的三步曲​​​​3.直接插入排序​​​​4.插入排序的本质​​1.插入排序的思想基本思想:将无序子序列中的一个或几个记录......
  • c语言实现简单的飞机小游戏
    在今天浏览csdn的过程中,看到了一个用c语言做的简单的飞机小游戏,感觉非常有意思,代码如下:#include<stdio.h>#include<stdlib.h>#include<conio.h>intmain(){intx=15......
  • Qt for Android开发环境这样设置简单正确高效
    1.按照如下网址安装设置JDK、SDK、NDK版本并创建环境变量:JAVA_HOME、ANDROID_SDK_ROOT、ANDROID_NDK_ROOT。https://doc.qt.io/qt-6/android-getting-started.html2.如本......
  • Git简单总结
    0x01Git理解分布式版本控制器:在个人电脑,云端都有着所有的代码。版本控制,可自由回滚,向前向后。git记录的是快照,不是整个代码的备份;每个快照之间通过指针指向来记录。g......
  • 简单的主从复制
    简单的主从复制配置文件说明master:cat/etc/my.cnf[client]port=3306socket=/data/soft/mysql/mysql.sock[mysqld]user=mysqlport=3306socket=......
  • 冒泡排序(简单C++实现)
    实现代码如下://bubble_sort.cpp#include<stdio.h>voidprintArray(intarr[],intlen);//冒泡排序:最多进行n-1次排序intmain(){intarr[]={23,39,65,2......
  • pdf.js 企业微信浏览器无法打开及简单使用
     1.官网地址http://mozilla.github.io/pdf.js/getting_started/2.下载旧版本   3.复制到项目地址中使用<a>标签<ahref="../content/pdfjs-3.4.120-dist/web......
  • STL:map映照容器的简单用法(poj 2503 Babelfish)
    STL中map映照容器由一个键值和一个映照数据组成,具有一一对应的关系。结构为:键值--映照数据       例: aaa --111             bbb--222   ......
  • instanceof简单介绍
    官方说明是:判断左边的对象是不是右边对象类的实例   意思是说条件操作数类型int和int不兼容   instanceof左边不能是基本类型,需要是引用类型publicclass......