索引的顺序与数据文件的顺序一致,例如mysql的主键索引,一般一个表只有一个聚集索引
当记录的物理位置发生变化,索引文件需要同步变化索引的顺序与数据文件的顺序不一致,索引的值为主键,需要通过二级查询才能到达记录
当记录的物理位置发生变化,索引文件不需要变化为每个键建立索引
在顺序文件中,只为每个块建立一个索引键
索引是按序排列的,例如B+树索引
索引是无序的,通过hash来访问数据
线性散列
index=hash(key)%n,当发生冲突时,index++
多段散列
使用稠密和稀疏索引建立多级索引
响应时间 = 磁盘存储时间+CPU运算时间+数据传输时间
对于本地大型数据库一般只考虑磁盘存取时间
查询执行引擎
查询结果
实现的算法包括并,交,差,消除重复元组
如果内存可以至少容纳一个表的数据,可以把一个表的数据全部加载在内存,然后对键进行排序,然后通过扫描第二表表,一趟把结果计算出来
在两个表的数据都非常非常大,此时则需要先用归并算法得出两个表的排序记录,然后再在内存堆两个排序表进行并交差等运算,运算的过程中设计多次的磁盘读入和写出
每次运算的中间结果重新写回磁盘,下一个运算再次从磁盘读取中间结果并进行再次运算,直到得出结果
非常稳定安全慢每次运算的中间结果保存在内存,下次运算直接从内存获得中间结果并进行再次运算,直到得出结果
快不安全,有可能内存无法达到要求,发生内存溢出错误的数据输入
例如用户错误数据类型,效率低的sql
需要对客户端进行限制,并制定策略检测和禁止某些危险行为
系统错误
由于掉电,软件错误造成内存中数据丢失或者错误
通过数据库的恢复机制,从日志和事务中对数据进行恢复
介质故障
由于磁盘局部故障,例如磁头损坏,扇区损坏
通过存储的奇偶校验或者使用RAID技术
灾难性故障
发生不可逆转的灾难,导致数据据介质完全损坏,无法对介质进行任何的恢复
通过多地即时备份
Atomicity 原子性
事务是一个不可分割的单元,要么全部成功,要么全部失败
Consistency 一致性
事务前后数据的完整性必须保证业务的一致性
Isolation 隔离性
多个事务在并发处理时,互相隔离
Durability 持久性
事务一旦提交,它对数据的修改是永久的,即时此时发生数据库发生系统故障,也不应该对此有任何影响
从后往前找日志,把没有Commit T的事务进行撤销
检查点包括开始部分和结束部分
开始节点对目前正在活动的事务IdList进行记录
如果数据库检查到所有的IdList都已经完成,则打印一个结束检查点
如果从后往前遍历第一个遇到检查点的开始,则找上一个检查点的开始的位置开始遍历如果从后往前遍历第一个遇到检查点的结束,则找此检查点的开始位置开始遍历上一个检查点之前的事务是已经写入磁盘并进行了撤销扫描此检查点之后的事务,对没有提交的事务进行撤销事务有可能跨越多个检查点,此时需要再往前遍历频繁将数据更新到磁盘,导致性能不高
重做已经提交的事务
与undo类似,只是把撤销改成重做
两个事务,按照顺序一个接一个的执行
两个事务,通过指令穿插的方式执行,执行的结果与串行执行的结果一致
在某个事务的一个并发结果与串行化调度的结果不一致
保证可串行化的预防型策略
共享锁:读锁S排它锁:写锁X在提交前释放锁
遵循两阶段锁的并发控制算法是冲突可串行化调度。但仍然存在死锁和级联回滚的发生。
在提交之前不允许释放任何锁
可以避免级联回滚,但依然存在死锁
选择事务回滚的策略:
选择代价最小的事务为了防止饿死,将回滚次数考虑到代价中锁的协议开销大,并发提升有限保证可串行化的预防型策略
TS(T):事务开始执行的时间戳W(Q):在Q数据项上,写入的事务最大的时间戳R(Q):在Q数据项上,读取的事务最大的时间戳执行协议
T执行Read(Q)
if TS(T) < W(Q),回退
if TS(T) > W(Q),执行,并更新R(Q) = (TS(T), R(Q))
T执行Write(Q)
if TS(T) < R(Q),回退
If TS(T) < W(Q),回退(可以优化成忽略T对Q的写,并继续执行来提高并行度)
否则执行,并更新W(Q) = TS(T)
T回退,并赋予新的时间戳,重新执行
保证可串行化的诊治型策略
读阶段:读数据并保存在局部变量,并在局部变量中更新数据有效性检查阶段:检查如果把局部变量更新到数据库中而不违背可串行性写阶段:把数据更新到数据库协议的术语
start(T):T开始执行的时间validation(T):完成有效性检查的时间Finish(T):完成写的时间RS(T):读数据项的集合WS(T):写数据项的集合对于T和先于它执行的U满足以下某一条件,则U和T可串行化
finish(U)<start(T)WS(U)与RS(T)无交集,finish(U)<validation(T)WS(T)与RS(T)无交集,WS(U)与WS(T)无交集,validation(U)<validation(T)严格执行隔离会严重降低吞吐量,因此需要系统根据应用灵活设置隔离级别
可串行化可重复度读已提交读未提交