MIT6.5830-Lab6
MIT6.5830 的数据库课程。Lab6 主要是完成数据库的 STEAL / NO FORCE 策略,也就是基于 undo log 的日志回滚和基于 redo log 的崩溃恢复。 Undo log是什么 每当InnoDB引擎要对一条记录进行修改、删除、新增时,要把回滚时需要的信息都记录到undo log里,比如: 在插入一条记录时,要把这条记录的主键记录下来,方便回滚时根据主键将对应的记录删除; 在删除一条记录时,要把这条记录的所有内容都记录下来,方便回滚时把这些内容组成的记录插入回去; 在更新一条记录时,要把更新列的旧值记录下来,方便回滚时把该记录的旧值复原回去。 Redo log是什么 为什么要有Redo...
MIT6.5830-Lab5
MIT6.5830 的数据库课程。Lab5 主要是完成 InnoDB 的索引,完成 B+ 树的查询、插入、删除操作。 索引InnoDB存储数据InnoDB是以数据页(默认16KB)为单位进行I/O读写的。 多个数据页之间是以双向链表结构连接(逻辑上的连续)的,数据页中的指针存在于File Header文件头。 数据页中的数据检索数据页的作用是存储数据,重点就是User Records用户记录部分:数据页中的记录按照主键顺序组成单向链表。单向链表的特点是插入和删除非常方便,但是检索效率低——因此数据页中需要有一个页目录,起到快捷索引的功能。 上图要注意的细节: 每个分组最后一条记录的头信息中会存储该组一共有多少条记录,作为 n_owned...
MIT6.5830-Lab4
MIT6.5830 的数据库课程。Lab4 主要是完成数据库事务以及锁机制,在 Lab 中只是考虑设计了 page 级别锁。 Exercise1 Exercise2 Exercise3 Exercise4 Exercise5 为了简化工作,Lab4采用了NO STEAL/FORCE缓冲区策略,不需要记录undo log和redo log日志(Lab6中完成): NO STEAL:不允许一个未提交的事务将修改更新到磁盘,即磁盘中不会存在uncommitted数据,因此无需回滚操作,不需记录undo log。 FORCE:事务在提交之后必须将所有更新立刻持久化到磁盘(产生很多随机写,效率低),但无需记录redo log。 背景知识事务事务:事务是一组以原子方式执行的数据库操作(读取、插入、删除),是不可分割的。 事务的四大特性(ACID) 原子性(Atomicity):事务是一个不可分割的单位。 一致性(Consistency):事务执行是从一个一致状态到另一个一致状态,一致指的是:①...
MIT6.5830-Lab3
MIT6.5830 的数据库课程。Lab3 主要是完成数据库查询优化的成本优化器。 Exercise1 Exercise2 Exercise3 ...
MIT6.5830-Lab2
MIT6.5830 的数据库课程。Lab2 主要是完成查询的连接和过滤、实现聚合下的查询操作、对表的插入删除以及实现数据库中非常重要的 LRU 页面置换算法。 任务目录 Exercise1:实现查询的连接和过滤 Exercise2:实现聚合操作MIN、MAX、COUNT、SUM、AVG Exercise3:实现修改表的方法,完成添加和删除 Exercise4:实现Insert和Delete操作符 Exercise5:实现BufferPool的页面置换算法 Exercise1 实现Predicate、JoinPredicate、Filter、Join Predicate类Filter的辅助类,用于筛选满足条件的tuple:将tuple中的字段与指定字段进行比较,实现对单个tuple的过滤操作(比较逻辑有==、>=、<=、>、<、!=、LIKE等)。 参数: 指定的比较字段(也是Field.compare()的参数):private Field operand; tuple中指定字段对应字段的索引:private...
MIT6.5830-Lab1
前段时间学习一下 MySQL,正好准备一个手撕轮子项目,就准备完成这个 MIT6.5830 的数据库课程。Lab1 主要是完成一些简单的数据库定义以及实现简单的全表扫描。 任务目录 exercise1:实现元组以及元组属性字段 exercise2:实现数据库目录,包含数据库现有的表信息 exercise3:实现BufferPool,将内存读取过的数据页缓存下来 exercise4:实现页面id、数据记录id以及Page类 exercise5:实现磁盘文件的接口HeapFile,通过HeapFile可以从磁盘读写数据 exercise6:实现全表扫描 Exercise1 实现Tuple、TupleDesc两个类 在数据库中,行被称为元组(tuple)或记录(record),列称为字段(field)。tuple元组在数据库中是一组Field对象的集合。 TupleDesc类 参数: private CopyOnWriteArrayList<TDItem>...
Java集合
复习一下Java的集合:分为单列集合和双列集合,单列集合有List和Set两类,双列集合是Map集合。List接口的实现类有ArrayList, LinkedList;Set和Map可以配合着学,主要有HashSet–HashMap, LinkedHashSet–LinkedHashMap, TreeSet–TreeMap三组。 Collection集合 总结一下Collection单列集合的常用功能有哪些,ArrayList、LinkedList、HashSet、LinkedHashSet、TreeSet集合都可以调用下面的方法: Collection集合的遍历方式: 迭代器遍历集合 当调用iterator()方法获取迭代器时,当前指向第一个元素; hasNext()方法则判断这个位置是否有元素,如果有则返回true,进入循环; 调用next()方法获取元素,并将当月元素指向下一个位置; 等下次循环时,则获取下一个元素,依此类推。 12345Iterator<String> it =...
Java的深浅拷贝
今天在刷算法题的时候忘记了引用数据类型深浅拷贝的问题,正好借此机会来复习一下。 拷贝的分类 引用拷贝 没有创建新的内存空间,只是复制了一个引用变量指向了堆空间中相同的地址。 对象拷贝 创建对象的一个副本,创建了新的对象指向不同的地址空间。而深浅拷贝的区别在于对象里面的属性拷贝方式。 浅拷贝 属性就是引用拷贝,指向同一地址。 深拷贝 属性也是对象拷贝,不是同一地址。 引用拷贝1234Teacher teacher = new Teacher("riemann", 28);Teacher otherTeacher = teacher; // 没有创建新的对象System.out.println(teacher);System.out.println(otherTeacher); 它们的地址值是相同的,teacher和otherTeacher只是引用而已,他们都指向了一个相同的对象Teacher(“riemann”,28)。 对象拷贝1234Teacher teacher = new...
Linux入门
Linux的常见命令和Linux中安装jdk、mysql等。 Linux基础命令文件目录操作命令 ls -a -l cd ~:表示用户的home目录 .:表示当前所在目录 ..:表示目前目录位置的上级目录 cat -n:显示行号 more:分页的形式显示文件内容 回车键:向下滚动一行 空格键:向下滚动一屏 b:返回上一屏 q或者Ctrl+C:退出more tail:查看文件末尾的内容 -f:动态读取文件末尾内容并显示,常用于日志文件的内容输出 mkdir:创建目录 -p:可以实现多级目录的同时创建(mkdir 1/2/3) rmdir:删除空目录 拷贝移动命令 cp:用来复制文件或目录(cp [-r] source dest) -r:复制该目录下的所有子目录和文件 mv:为文件或目录改名,或移动到其他位置(mv source...
01-MySQL基础
Mysql是一种关系型数据库,这篇博客作为数据库的基础篇主要讲解操作关系型数据的SQL编程语言。 数据库相关概念数据库 数据模型数据模型是数据库中数据的存储方式,是数据库系统的基础。 SQL语言DDL 数据定义语言 数据库操作 12345show databases;create database 数据库名;use 数据库名;select database();drop database 数据库名; 表操作 123456show tables;create table 表名 (字段 字段类型, 字段 字段类型...);desc 表名;show create table 表名;alter table 表名 add / modify / change / drop / rename to ...;drop table...