从0开始学习数据库

news2024/11/27 15:17:18

一个数据库最重要的部分是什么?
关系型数据库mysql有着四大特性,原子性,隔离性,一致性,持久性。
kv数据库有着原子性,持久性,弱一致性。
可见,不管数据库的存储引擎是什么,其根本大概就是保证原子性,持久性和一致性的同时,通过一些优化提高数据库的查询效率。
以postgreSQL为例,系统结构包括链接管理,编译执行系统,存储管理系统,事务系统。不可否认这些都很重要,但我认为最重要的应当是存储管理和事务。
目前,我认为,一个数据库的核心实现在于事务和持久化,以及后续的一系列操作的优化。
因此,重点是首先解决事务和持久化。
从github上寻找数据库,分析源码,看他们是如何实现事务和持久化,就是本文的重点了。

skiplist-cpp项目

一个基于跳表的存储kv引擎:https://github.com/youngyangyang04/Skiplist-CPP
这个是我第一个接触的存储引擎,非常简单的一个项目,核心的实现只有两个cpp文件,这里就不多介绍了,ReadMe写的很清楚。
提供增删查三个接口,
没有进行事务处理,原子性是通过对方法加锁的方式比较粗暴的实现的。
持久化是直接kv转string以文本的方式通过fstream.writh保存字符串在本地。直接通过readline的方式进行本地存取,我觉得这不是一个理想的方式。

BeetleDB项目

一个简单的数据库实现:https://github.com/chenbjin/BeetleDB
作者的码风挺好,但是没有文档,只能自己扒源码慢慢看,算是一个比较全的流程吧,从sql解析,到数据库,表这些的创建,再到索引的建立,增上改查和数据持久化。
尽管我关注的是事务和持久化,但由于该项目的文档比较简陋,所以简单梳理一下项目结构:
在这里插入图片描述
大概介绍一下,我将项目主要分为三部分:1.业务,2.存储,3.索引

  1. 业务部分:主要由Interpreter,SQLStatement,CatalogManager和API部分进行管理。
  2. 索引部分:主要由IndexManager,BPlusTree进行管理。
  3. 存储部分:主要由RecoderManager,BufferManager,fileHandle,fileInfo,BlockHandle和BlockInfo进行管理。

BeetleDB是单线程,没有事务管理的数据库,因此我们对它的学习重点是在持久化和索引。

持久化

持久化值得说一说,BeetleDB在持久化上做的工作就比上面的skiplist-cpp项目要多一些,它将文件保存为下图这样的二进制文件,一个表中的数据保存在一个文件中,一个文件由多个block组成,每个block保存着逻辑相邻block的信息以及block本身保存的数据,这样做的好处就是可以直接通过文件指针跳到对应的存储单元中进行本地修改,减少遍历文件的花费,这一手我觉得是可以参考学习的。
在这里插入图片描述
给出核心代码(部分)BlockInfo::WriteInfo()

path += file_->get_db_name() + "/" + file_->get_file_name();
if (file_->get_type() == FORMAT_INDEX) path += ".index";
else path += ".records";

ofstream ofs(path, ios::binary);
ofs.seekp(block_num_*4*1024);
ofs.write(data_,4*1024);
ofs.close();

这里的代码就是关于写入一个file中的block的方法了,很清晰,先通过path找到文件,用二进制打开,然后用seekp移动文件指针到对应的block上,直接write一个block的数据就好了。read的方法同理,把write换成read即可。
这些写入的block都是在内存中维护的,因此当要对一个内存中的block持久化的时候,直接调用对应blockInfo对象的write方法即可。
至于如何维护内存中的blockInfo对象信息,可以结合上面的项目结构去源码里看,个人感觉还蛮清晰的。
简单提一下关于crud的操作,业务逻辑主要集中在RecordManager中,其实本质还是现在内存中找,找不到就去磁盘一个block一个block的找。

索引

建立在一个表column上的index是通过B+树进行维护的。
其实就是常见的B+树操作,注意一点就是,这里b+树的一个节点可以保存一个block的信息,里面的key顺序存储,在查找的时候有二分和顺序两种选择,阈值源码中定义的是20。

感觉叶子节点比较重要:BPlusTreeNode::GetKeys(), BPlusTreeNode::GetValues(), BPlusTreeNode::GetNextLeaf()

TKey BPlusTreeNode::GetKeys(int index)
{
	TKey k(tree_->GetIndex()->get_key_type(), tree_->GetIndex()->get_key_len());
	int base = 12;
	int lenr = 4 + tree_->GetIndex()->get_key_len();
	memcpy(k.get_key(), &buffer_[base + index * lenr+4], tree_->GetIndex()->get_key_len());
	return k;
}
int BPlusTreeNode::GetValues(int index)
{
	int base = 12;
	int lenR = 4 + tree_->GetIndex()->get_key_len();
	return *((int*)(&buffer_[base + index*lenR]));
}
int BPlusTreeNode::GetNextLeaf()
{
	int base = 12;
	int lenR = 4 + tree_->GetIndex()->get_key_len();
	return *((int*)(&buffer_[base + tree_->get_degree()*lenR]));
}

这里的buffer就是block对应的那一块数据,索引文件的block相比起普通文件的block,每行多了4个字节的空间,从BPlusTreeNode的set方法中就可以看出来,一个block组成为nodetype,count,parent,多至少4字节的空间来保存int型变量。

BettleDB数据库是一个小型的单线程数据库,没有事务管理,但提供了一个相比起skiplist-cpp更好的持久化方法,和索引示例。这也是我认为BettleDB最重要的部分之一。

LevelDB

源码:https://github.com/messixukejia/leveldb
一个开源的优秀的kv NoSQL。码风很好,网上的资料也有,因此可以尝试入门学习。
可以学习它的事务,存储,和sql优化方案。

PostgreSQL

源码:https://github.com/postgres
一个开源的经典关系型数据库。码风很好,源码也容易获得,可以尝试继续学习。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/518985.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【计算机网络】第一章 计算机网络基础(期末急救包)

目录 前言 正文 考点 1.1 计算机网络组成 1.2 计算机网络的分类 ——4种 1.3计算机网络的性能指标 1.4 计算机网络标准化工作及相关组织 2.计算机网络体系结构与模型 结语 前言 期末将至,相信有的同学们还在为怎么过期末而发愁吧!不用担心&#…

谈「效」风生 | 「自动化」聊起来简单,做起来难

#第4期:“自动化”聊起来简单,做起来难# 在上一期《如何找到现有研发体系的「内耗问题」》中,我们聊了评估现有研发体系,正确的找到“体系内耗问题”,是改变研发体系的第一步。本期我们继续聊下一个关键点就是研发体系…

多USB工业相机的使用

USB相机的使用 USB3.0引入了“SuperSpeed”(SS)传输速率。理论传输速度高达625 MByte/s, SuperSpeed传输可以在短时间内传输大量数据,适用于许多视觉应用。给出的带宽上限是一个理想化的理论值。对于实际应用,主机控制器(Host Controller&am…

红黑树下岗,内核新数据结构上场:maple tree!

在外界看来,Linux 内核的内部似乎变化很少,尤其是像内存管理子系统(memory-management subsystem)这样的子系统。然而,开发人员时常需要更换内部接口来解决某些长期存在的问题。比如,其中一个问题就是用来保…

五个程序员必要的在线绘图工具

说到程序员,每个人的第一反应都是敲代码。事实上,画图也是程序员必备的技能之一。各种流程图、架构图、UML类图、线框图等多种多样。 1.即时设计 即时设计是一款免费的在线 UI 设计工具,无系统限制,浏览器打开即可使用&#xff…

算法修炼之练气篇——练气七层

博主:命运之光 专栏:算法修炼之练气篇 前言:每天练习五道题,炼气篇大概会练习200道题左右,题目有C语言网上的题,也有洛谷上面的题,题目简单适合新手入门。(代码都是命运之光自己写的…

Recoil在React中完整实践方案

先让我吐槽一下,Recoil这个玩意文档是真的不友好,另外发现国内很少有人去用Recoil,然后好多文章都是照搬官网文档,我特喵的要是出了问题直接看官方不就行了。如果你碰巧看到这个文章了,就细心看完吧,绝对的…

从一文不值到数字黄金 诞生于极客圈的比特币,究竟经历了什么?

比特币作为技术性很强的神奇发明,从一文不值到数字黄金,在发展过程中不仅为金融范式转变奠定了基础,改变了人们感知和交易价值的方式,也为无数数字资产开辟了一条可追随的道路。 比特币之所以复杂,是因为技术属性、金融…

在线未注册域名批量查询-域名注册批量查询

域名批量注册查询 域名批量注册查询是一种工具,可以帮助用户批量查询并注册多个域名。这种工具通常被域名管理者、品牌专家、互联网营销人员等使用。 以下是域名批量注册查询工具的优点: 提高效率:与手动单独注册域名相比,域名批…

机器学习基础(粗学)【未完待续】

卷积神经网络粗学 卷积:用卷积求系统的存量 卷积,就是把输出函数反转一下。。。。(离谱) 实际不是从物理意义上理解的函数翻转,而是应该从数学意义上,去理解卷积的…

六、IDEAJ同一个服务启动多台服务器的方法

目录 1、打开启动类配置窗口--->选择Edit Configurations进入配置窗口 2、从左侧Springboot应用选择需要启动的多台服务器(服务只要启动一次就会在此窗口有显示)--->勾选Allow parallel run菜单(默认不勾选,则只能启动一台…

【JAVAEE】常见的锁策略

目录 1.常见的锁 1.乐观锁&悲观锁 2.轻量级锁&重量级锁 3.读写锁&普通互斥锁 4.自旋锁&挂起等待锁 5.可重入锁&不可重入锁 6.公平锁&非公平锁 2.CAS 1.什么是CAS 2.CAS的应用 1.实现原子类 2.实现自旋锁 3.synchronized用到的锁策略 1.s…

RobotFramework +appium实现Android自动化

环境准备 1、已安装python37版本(SDK、JDK均已安装完成,且环境变量都配置好了)。 2、已安装robotframework。 3、已安装安卓模拟器(本文使用夜神模拟器)。 4、安装appium(下载地址:http://6…

立创梁山派学习笔记——GPIO输出控制

梁山派 前言开发板简介GD32F407ZGT6官方资源数据手册1.系统框图2. 引脚复用表3.命名规则4.其他 用户手册固件库与PACK包 开发环境搭建立创官方的资料包资料齐活,开发1.工程搭建2.使用寄存器点亮LEDGPIO数量LED的GPIO口GPIO的配置流程GPIO的寄存器1.端口控制寄存器&a…

假如你是一位测试主管,如何判断一名测试工程师是否优秀?

假如你是一位测试主管,去评价一名测试工程师是否优秀,那么你将如何去判断呢?你最看重的是哪方面的能力呢? 对于这个问题,是不能一概而论的,要分为两种情况,情况不同,答案一定是不同…

自媒体素材哪里找?这5个网站告诉你答案。

做自媒体最需要的就是各种视频、配乐、图片等素材了。想要图文好,那就必须要一个好封面图。想要视频好,那就必须要有好的素材和配乐。 那要如何找到这些素材?看这几个网站就够了。 1、菜鸟图库 https://www.sucai999.com/video.html?vNTY…

基于Kubernetes集群构建大中型企业CICD应用平台(1)-- devOps

一、DevOps介绍 软件开发最开始是由两个团队组成: 开发计划由开发团队从头开始设计和整体系统的构建。需要系统不停的迭代更新。 运维团队将开发团队的Code进行测试后部署上线。希望系统稳定安全运行。 这看似两个目标不同的团队需要协同完成一个软件的开发。 …

【游戏逆向】《创世战车》玩家遍历分析

对于这种FPS游戏来说,玩家的血量并不是很关键,不过想分析玩家对象内的其他信息,还是要从血量作为突破口的。 但是由于试驾场是很少有发包的,包括战车的攻击等等,所以只能通过正常匹配战斗进行扫描。又由于匹配模式中没…

局域网会议软件

局域网会议软件怎么选?连通宝视频会议系统,当然也可以从以下维度进行视频会议选择。 1、部署简单方便连通宝视频会议系统部署简单,五分钟部署专业级的视频会议系统,系统支持主流视频会议设备,支持桌面型会议、机顶盒型…

字节面试挂在2面,复盘总结了经验,决定再战一次.....

先说下我基本情况,本科不是计算机专业,现在是学通信,然后做图像处理,可能面试官看我不是科班出身没有问太多计算机相关的问题,因为第一次找工作,字节的游戏专场又是最早开始的,就投递了&#xf…