栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

手写Mysql(十一)总结篇

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

手写Mysql(十一)总结篇

Mysql分为后端和前端,前后端通过 socket 进行交互。前端(客户端)的职责很单一,读取用户输入,并发送到后端执行,输出返回结果,并等待下一次输入。Mysql后端则需要解析 SQL,如果是合法的 SQL,就尝试执行并返回结果。不包括解析器,v 的后端划分为五个模块,每个模块都又一定的职责,通过接口向其依赖的模块提供方法。五个模块如下:

 

1 Transaction Manager(TM)
2 Data Manager(DM)
3 Version Manager(VM)
4 Index Manager(IM)
5 Table Manager(TBM)

五个模块的依赖关系如下:

每个模块的职责如下:

  1. TM 通过维护 XID 文件来维护事务的状态,并提供接口供其他模块来查询某个事务的状态。
  2. DM 直接管理数据库 DB 文件和日志文件。DM 的主要职责有:1) 分页管理 DB 文件,并进行缓存;2) 管理日志文件,保证在发生错误时可以根据日志进行恢复;3) 抽象 DB 文件为 DataItem 供上层模块使用,并提供缓存。
  3. VM 基于两段锁协议实现了调度序列的可串行化,并实现了 MVCC 以消除读写阻塞。同时实现了两种隔离级别。
  4. IM 实现了基于 B+ 树的索引,BTW,目前 where 只支持已索引字段。
  5. TBM 实现了对字段和表的管理。同时,解析 SQL 语句,并根据语句操作表。

read语句的流程
假设现在要执行read * from student where id = 1, 并且在id上已经建有索引. 执行过程如下:
1、TBM接受语句, 并进行解析.
2、TBM调用IM的search方法(注意IM不经过VM版本控制), 查找对应记录所在的地址.
3、TBM调用VM的read方法, 并将地址作为参数, 从VM中尝试读取记录内容.
4、VM通过DM的read操作, 读取该条记录的最新版本.
5、VM检测该版本是否对该事务可见, 其中需要Visibility.isVisible()方法.
6、如果可见, 则返回该版本的数据.
7、如果不可见, 则读取上一个版本, 并重复5, 6, 7.
8、TBM取得记录的二进制内容后, 对其进行解析, 还原出记录内容.
9、TBM将记录的内容返回给客户端.

insert语句的流程
假设现在要执行insert into student values “xiaohong” 1这条语句. 执行过程如下:
1、TBM接受语句, 并进行解析.
2、TBM将values的值, 二进制化.
3、TBM利用VM的insert操作, 将二进制化后的数据, 插入到数据库.
4、VM为该条数据建立版本控制, 并利用DM的insert操作, 将数据插入到数据库.
5、DM将数据插入 到数据库, 并返回其被存储的地址.
6、VM将得到的地址, 作为该条记录的handler, 返回给TBM.
7、TBM计算该条语 句的key, 并将handler作为data, 并调用IM的insert, 建立索引.
8、IM利用DM提供的read和insert等操作, 将key和data存入 索引中.
9、TBM返回客户端插入成功的信息.

可以改进的地方

恢复日志,设置的是从头恢复,在测试的时候,发现这样的耗时特别长,暂时的想法是引入检查点。

多种索引形式

改进成分布式数据库

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/975472.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号