❤️❤️❤️
数据库:
bit&Byte,1KB
1MB=2^10KB
1GB=2^10GB
1TB=2^20MB
大数据:
1TB=2^20MB
1PB=2^30MB
1EB=2^40MB
1ZB=2^50MB
1YB=2^60MB
1BB=2^70MB
数据组织的基础--存储体系:
将不同性价比的存储器组织在一起,满足高速度、大容量、低价格的需求
CPU与内存直接交换信息,按存储单元(存储字)进行访问
外存按存储块进行访问,其信息需先装入内存,才能被CPU处理
RAID技术:
并行处理:并行读取多个磁盘
可靠性:奇偶校验与纠错
❤️❤️❤️
索引:是定义在存储表基础之上,有助于无需检查所有记录而快速定位所需记录的一种辅助存储结构
存储表称为主文件,存储索引项的文件称为索引文件
分类:排序索引文件、散列索引文件
排序码:对主文件进行排序存储的那些属性或属性组
索引码:即索引字段,不一定具有唯一性
搜索码:在主文件中查找记录的属性或属性集
创建索引:
create [unique] index indexname on tablename(colname[asc|desc]...);
示例:
1.
create index idxSname on student(sname);
2.
drop index idxSname;
稠密索引:对于主文件中每一个记录(形成的每一个索引字段值),都有一个索引项和它对应
稀疏索引:对于主文件中部分记录,有索引项和它对应 //要求主文件必须按对应索引字段属性排序存储
主索引:通常是对每一存储块有一个索引项,索引项的总数和存储表所占的存储块数目相同,存储表的每一存储块的第一条记录,又称为锚记录,或简称块锚
辅助索引:是定义在主文件的任一或多个非排序字段上的辅助存储结构
一个主文件仅有一个主索引,但可以有多个辅助索引
主索引通常建立于主码/排序码上面,辅助索引建立于其他属性上面
可以利用主索引重新组织主文件数据,但辅助索引不能改变主文件数据
主索引是稀疏索引,辅助索引是稠密索引
聚簇索引:是指索引中邻近的记录在主文件中也是邻近存储的
非聚簇索引:是指索引中邻近的记录在主文件中不一定是邻近存储的
主索引通常是聚簇索引,辅助索引通常是非聚簇索引
一个主文件只能有一个聚簇索引文件,但可以有多个非聚簇索引文件
倒排索引:查找关键词所在的文档
多级索引:当索引项比较多时,可以对索引再建立索引
多属性索引:索引字段由表的多个属性值组合在一起形成的索引
散列索引:使用散列技术组织的索引
网络索引:使用索引字段进行交叉联合定位与检索
B+树索引:一种以树型结构来组织索引项的多级索引
能够自动保持与主文件大小相适应的树都层次
一块中有n-1索引项加上一个指针(n最大值为341)
非叶结点指针指向索引块,叶子结点指针指向主文件的数据块或数据记录
叶结点的最后一个指针可能不同于其他指针--始终指向其下一个数据库
B树:
索引字段值仅出现一次
指向主文件的指针出现于叶结点或非叶结点
所有结点才能覆盖所有键值的索引
❤️❤️❤️
数据库的三大类操作:
1.一次单一元组的一元操作 //迭代器算法
2.整个关系的一元操作 //一趟扫描算法、两趟扫描算法、多趟扫描算法
3.整个关系的二元操作 //一趟扫描算法、两趟扫描算法、多趟扫描算法
两种策略:物化计算策略、流水线计算策略
物化计算策略一组关系操作相当于扫描一遍数据库,产生一个临时的中间结果
迭代器:迭代的读取一个集合中每一个元素,而封装其读取细节
扫描算法:基于排序的算法、基于散列的算法、基于索引的算法
聚簇关系:关系的元组集中存放
TableScan(R)--表空间扫描算法 //扫描结果未排序:B(R)时间复杂度
SortTableScan(R) //扫描结果排序:3B(R)
IndexScan(R)--索引扫描算法 //扫描结果未排序:B(R)
SortIndexScan(R) //扫描结果排序:B(R)or3B(R)
非聚簇关系:关系的元组不一定集中存放
扫描结果未排序 //T(R)
扫描结果排序 //T(R)+2B(R)
两趟算法:
第一趟:划分子集,并使子集具有某种特性
第二趟:处理全局性内容的操作,形成结果关系
❤️❤️❤️
查询优化:
语义优化:利用模型的语义及完整性规则,优化查询
语法优化(逻辑层优化):利用语法结构,优化操作执行顺序
执行优化(物理层优化):存取路径和执行算法的选择与执行次序优化
事务:是数据库管理系统提供的控制数据操作的一种手段,通过这一手段,应用程序员将一系列的数据库操作组合在一起作为一个整体进行操作和控制,以便数据库管理系统能够提供一致性状态转换的保证
事务的特性:ACID
原子性Atomicity:DBMS能够保证事务的一组更新操作是原子不可分的,即对DB而言,要么全做,要么全不做
一致性Consistency:DBMS保证事务的操作状态是正确的,符合一致性的操作规则,它是进一步由隔离性来保证的
隔离性Isolation:DBMS保证并发执行的多个事务之间互相不受影响。
持久性Durability:DBMS保证已提交事务的影响是持久的,被撤销事务的影响是可恢复的
事务调度:一组事务的基本步(读、写、其他控制操作如加锁、解锁等)的一种执行顺序称为对这组事务的一个调度
可串行性:如果不管数据库初始状态如何,一个调度对数据库状态的影响都和某个串行调度相同,那我们说这个调度是可串行化的或具有可串行性
标记模型:
rT(A):事务T读A
wT(A):事务T写A
冲突:调度中一对连续的动作,它们满足,如果它们的顺序交换,那么涉及的事务中至少有一个事务的行为会改变
同一事务的任何两个操作都是冲突的
不同事务对同一元素的两个写操作时冲突的
不同事务对同一元素的一读一写操作时冲突的
冲突可串行性:一个调度,如果通过交换相邻两个无冲突的操作能够转换到某一个串行的调度,则称此调度为冲突可串行化的调度
满足冲突可串行性,一定满足可串行性,反之不然
冲突可串行性判别算法:
构造一个前驱图(有向图)
结点是每一个事务Ti,如果Ti的一个操作与Tj的一个操作发生冲突,且Ti在Tj前执行,则绘制一条边,由Ti指向Tj,表明Ti要在Tj前执行
如果此有向图没有环,则此冲突时可串行化的
锁:是控制并发的一种手段
每一数据元素都有一唯一的锁
每一事务读写数据元素前,要获得锁
如果被其他事务持有该元素的锁,则要等待
事务处理完成后要释放锁
标记模型:
Li(A):事务Ti对数据元素A加锁
Ui(A):事务Ti对数据元素A解锁
排他锁X(eXclusive locks):只有一个事务能读、写,其他任何事务都不能读、写
共享锁S(Shared locks):所有事务都可以读,但任何事务都不能写
更新锁U(Update locks):初始读,以后可以升级为写
增量锁I(Incremental lock):增量更新,区分增量更新和其他类型的更新
SQL隔离性级别:
读未提交(read uncommitted)
读已提交(read committed)
可重复读(repeatable read)
可串行化(serializable)
两段封锁协议:
读写数据之前要获得锁,每个事务中所有封锁请求先于任何一个解锁请求
两阶段:加锁段,解锁段,加锁段中不能有解锁操作,解锁段中不能有加锁操作
时间戳:
一种基于时间的标志,将某一时刻转换成的一个数值
时间戳具有唯一性和递增性
基于时间戳的并发控制:
借助于时间戳,强制使一组并发事务的交叉执行,等价于一个特定顺序的串行执行
特定顺序:时间戳由小到大
执行时判断冲突:若有冲突,则撤销事务,并重启该事务,此时该事务获得了一个更大的时间戳
规则:
RT(x)读过该数据事务中最大的时间戳
WT(x)写过该数据事务中最大的时间戳
TS(T)事务的时间戳
C(x)x的提交位
基于有效性确认的并发控制:
事务在启动时刻被赋予唯一的时间戳
为每一活跃事务保存其读写数据的集合,RS(T)事务T读数据的集合,WS(T)事务T写数据的集合
通过对多个事务的读写集合,判断是否有冲突(存在事实上不可实现的行为),即有效性确认,来完成事务的提交与回滚,强制事务以可串行化的方式执行
事务分三个阶段进行:读阶段、有效性确认阶段、写阶段
调度器维护三个集合:START集合--已经开始但尚未完成有效性确认的事务集合,对此集合中的事务,调度器维护START(T),即事务T开始的时间;VAL集合--已经确认有效性但尚未完成第3阶段写的事务,对此集合中的事务,调度器维护START(T)和VAL(T),即T确认的时间;FIN集合--已经完成第3阶段的事务,对这样的事务T,调度器记录START(T),VAL(T)和FIN(T),即T完成的时间
❤️❤️❤️
数据库故障:
事务故障:
某一个程序(事务)自身运行错误所引起的故障
影响该程序(事务)本身
系统故障:
由于掉电、非正常关机等所引起的故障
影响正在运行的事务以及数据库缓冲区,数据库缓冲区将涉及正在运行和已经运行的事务
介质故障:
由于介质损坏等所引起的故障
影响是全面的,既影响内存中的数据,又影响介质中存储的数据
事务故障的恢复:事务故障可通过重做事务和撤销事务来恢复,重做事务可保证已提交事务的持久性,而撤销事务可消除未提交事务的影响
系统故障的恢复:
运行日志:是DBMS维护的一个文件,该文件以流水方式记录了每一个事务对数据库的每一次操作及操作顺序
运行日志直接写入介质存储上,会保持正确性
当事务对数据库进行操作时:先写运行日志,写成功后,再与数据库缓冲区进行信息交换
DBMS在运行日志中定期的设置和更新检查点
介质故障的恢复:
备份
READ(X,t):将元素X读到事务的局部变量t中
WRITE(X,t):将事务局部变量t写回元素X
INPUT(X):将元素X从磁盘读入到内存缓冲区中
OUTPUT(X):将元素X写回到磁盘中
COMMIT:事务提交
ABORT:事务撤销
持久性:
已提交事务--缓冲区内容保证写回磁盘
未提交事务--缓冲区内容不能影响磁盘
缓冲区处理策略:
Force:内存中的数据最晚在commit的时候写入磁盘
No steal:不允许在事务commit之前把内存中的数据写入磁盘
No force:内存中的数据可以一直保留,在commit之后过一段时间再写入磁盘(此时在系统崩溃的时候可能还没有写入磁盘,需要Redo)
Steal:允许在事务commit之前把内存中的数据写入磁盘(此时若系统在commit之前崩溃了,已经有数据写入磁盘了,要恢复到崩溃前到状态,需要Undo)