MuziDB数据库-0.项目描述

简介: 前言该项目写完也有一段时间了,为了避免以后忘记该项目的一些实现的原理,所以写下这篇博客来记录一下该项目的设计等

项目整体


MuziDB分为前端与后端,前后端交互通过socket进行交互,前端的作用就是读取用户输入并发送到后端进行执行然后输出返回结果,并等待下一次的输入,后端则需要解析SQL,尝试执行并返回结果。MuziDB的后端分为五个模块

Transaction Manager (TM )
Data Manager (DM)
Version Manager (VM)
Index Manager (IM)
Table Manager (TBM)


项目结构


0f4136332f944455b7e27eb66425df43.png

TM:维护XID文件来维护事务的状态,并提供接口给其它模块来查询某个事务的状态

DM:直接管理数据的DB文件和日志文件

VM:基于两段锁协议实现调度序列的可串行化,并实现了MVCC消除读写阻塞

IM:实现了B+树的索引

TBM:实现了对字段和表的管理,同时解析SQL语句并根据语句操作表


项目涉及四个文件


0661dd745eed4b8f8ba8e104a4289963.png

根据UID可以定位到是那个页面多少偏移量,因为pgno是int类型,offset是short类型,而我们返回的UID是long类型所以long占八个字节而UID = ((long)pgno << 32) | (long)offset,所以前四个字节是pgno所占用的,最后2个字节是offset占用的,所以只需要再经过简单换算就可以换算出来对应的pgno与offset,所以.db中的每个资源都有着唯一的UID,所以UID的作用可以相当于一个资源定位符


.bt文件

该文件只有8个字节,当创建一张新表的时候就会把新表的UID复制到这个文件保存


.xid文件

这个文件就是管理事务的文件,里面会保存首先8个字节的XIDCounter,然后接下来的每个字节就是保存一个事务的状态

efe0e53fed44496b955c666e8c8d527d.png这个文件对应的功能就是比较简单的TM,只需要保证事务的开启、提交、取消即可

事务对应着三种状态

0 - active
1 - committed
2 - aborted


.log文件

为什么一直不说.db文件呢,因为.db文件中的要素过多留到最后来讲

.log文件就是记录操作过程中产生的日志,为什么要记录日志呢,有了.db文件,.db文件中不是就已经存储了数据了吗?那MySQL数据中为啥又会存在redo、undo log日志呢,而且记录日志有助于后面实现可重复读,假如不记录日志的话,那么可重复读就不能够实现


日志文件格式如下 前四个字节记录所有日志的校验和,后面就是一个一个的[Log]对象即 [xchecksum] [log1] [log2] … [logn] [BadTail] ,badTail有可能会出现,比如当你记录最后一条日志的时候但是你没有记录完但是数据库宕机了那么这就是badTail

每个日志对象即[log]的形式是 [size][checksum][data]

其中size占四个字节,checksum占四个字节,data所占字节就是size所描述的

83816ef0860341bfa2615ac015c72a26.png.db文件


.db文件是最重要的一个文件了,里面包含表结构数据、表中数据、Node节点数据等,.db文件中保存的都是一个一个的DataItem结构,.db文件是以页来区分,每个页面大小为8k但是你也可以设置更大的容量,每个页面的前2个字节为该页面的偏移量(便宜量就是当前页面要从哪里开始写入新数据),

DataItem中存在三个字段

ValidFlag 1字节的标志位代表是否有效

Size 2字节Data的字段的大小

Data 就是数据

c6b6e9c35aa24598856bbeb34d7a2376.png

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
|
存储 关系型数据库 MySQL
一个项目用5款数据库?MySQL、PostgreSQL、ClickHouse、MongoDB区别,适用场景
一个项目用5款数据库?MySQL、PostgreSQL、ClickHouse、MongoDB——特点、性能、扩展性、安全性、适用场景比较
|
人工智能 JavaScript 关系型数据库
【02】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-ui设计图figmaUI设计准备-figma汉化插件-mysql数据库设计-优雅草卓伊凡商业项目实战
【02】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-ui设计图figmaUI设计准备-figma汉化插件-mysql数据库设计-优雅草卓伊凡商业项目实战
608 14
【02】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-ui设计图figmaUI设计准备-figma汉化插件-mysql数据库设计-优雅草卓伊凡商业项目实战
|
人工智能 JavaScript 安全
【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战
【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战
1088 13
【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战
|
数据管理 数据库 数据安全/隐私保护
Django—同一项目不同app使用不同数据库
在Django项目中实现不同app使用不同数据库的配置,可以通过配置多数据库、创建数据库路由和配置路由来实现。通过这种方法,可以有效地将数据隔离到不同的数据库,提高数据管理的灵活性和系统的可扩展性。希望本文能为开发者在Django项目中使用多数据库提供清晰的指导。
554 4
|
SQL 关系型数据库 MySQL
Go语言项目高效对接SQL数据库:实践技巧与方法
在Go语言项目中,与SQL数据库进行对接是一项基础且重要的任务
452 11
|
Java 关系型数据库 数据库连接
SpringBoot项目使用yml文件链接数据库异常
【10月更文挑战第3天】Spring Boot项目中数据库连接问题可能源于配置错误或依赖缺失。YAML配置文件的格式不正确,如缩进错误,会导致解析失败;而数据库驱动不匹配、连接字符串或认证信息错误同样引发连接异常。解决方法包括检查并修正YAML格式,确认配置属性无误,以及添加正确的数据库驱动依赖。利用日志记录和异常信息分析可辅助问题排查。
1662 11
|
SQL JavaScript 关系型数据库
node博客小项目:接口开发、连接mysql数据库
【10月更文挑战第14天】node博客小项目:接口开发、连接mysql数据库
|
Java 关系型数据库 MySQL
SpringBoot项目使用yml文件链接数据库异常
【10月更文挑战第4天】本文分析了Spring Boot应用在连接数据库时可能遇到的问题及其解决方案。主要从四个方面探讨:配置文件格式错误、依赖缺失或版本不兼容、数据库服务问题、配置属性未正确注入。针对这些问题,提供了详细的检查方法和调试技巧,如检查YAML格式、验证依赖版本、确认数据库服务状态及用户权限,并通过日志和断点调试定位问题。
1948 6
|
前端开发 Java 数据库连接
表白墙/留言墙 —— 中级SpringBoot项目,MyBatis技术栈MySQL数据库开发,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学
本文是一份全面的表白墙/留言墙项目教程,使用SpringBoot + MyBatis技术栈和MySQL数据库开发,涵盖了项目前后端开发、数据库配置、代码实现和运行的详细步骤。
519 0
表白墙/留言墙 —— 中级SpringBoot项目,MyBatis技术栈MySQL数据库开发,练手项目前后端开发(带完整源码) 全方位全步骤手把手教学
|
Java 数据库连接 数据库
数据库以及其他项目配置
该项目配置了数据库连接和MyBatis设置,并解决了配置文件加载问题。启动类使用 `@SpringBootApplication` 注解,可通过 `@ComponentScan` 指定扫描包。Lombok 自动生成 getter/setter 等方法,简化代码。Result 实体类用于统一返回格式。用户模块包括注册与登录功能,使用 MD5 加密密码、Spring Validation 参数校验及 JWT 认证。JWT 工具类处理令牌生成与解析,并通过拦截器验证。Redis 优化登录功能,利用 ThreadLocal 存储用户信息。此外,还包括文章模块的相关功能,如文章分类管理、
193 3

热门文章

最新文章