术语与基本概念
OLTP:Online Transaction Processing,在线事务处理,比如银行交易
 OLAP:Online Analytical Processing,在线分析处理,比如一些推荐系统
 RDBMS:Relational Database Management System
 SQL:Structured Query Language
 NoSQL:Not-Only SQL
 Scale Up:单机性能
 Scale Out:机器多
 Transaction(简写TXN):事务
硬盘要避免随机写



数据模型(Data Models)
- Relational Data:关系型数据库,表达起来比较直观简单。问题,数据冗余
 - Key-Values:键-值,hash 一下作为 key
 - Document:比如说 JSON
 - Graph:图
 - Columns:按照列去存储
 


CAP Theory
只能同时满足两个
- Consistency(一致性,和 ACID 的 C 不一样):指副本必须是一致的
 - Availability(可用性)
 - Tolerance to network Partitions(切分性)
 



数据库类型
SQL
Structured Query Language


NoSQL
Not-Only SQL
为什么出现了 NoSQL?原因之一是 NoSQL 对集群支持很好,可以支持大规模节点
NoSQL 一般是弱一致性:Weak consistency


时序数据库


图数据库-Neo4j

NewSQL



存储(Storage)
Record 在 Page 中两种存储方式:
- Packed Page:Page header(里有bitmap)+固定长的record
 - Slotted Page:Page Footer(里面记录每条record的长度)+变长的record
 
日志存储
Log-structed Files:LSM-Tree



索引(Index)
- B-tree(可以区间查询)
 - Hash
 

事务(Transaction,TXN)及 ACID
- Atomicity(原子性):不可分割,或成功或失败,无中间态
 - Consistency(一致性):前后一致,比如两个账号转账,转账钱和转账后总额一致
 - Isolation(隔离型):并发。当两个事务不相关时,保证可以并发,当相关时,需要保证并发时不会出现错误
 - Durability(持久性):永久存储
 




日志(Logging)实现 A 和 D


Force and Steal
- Steal:允许事务在中途写到磁盘。那么失败时需要 undo
 - No-Steal:不允许。那么失败时不需要 undo
 - Force:事务每一条 commit 后都必须写到磁盘,那么失败时不需要 redo
 - No-Force:不需要每条都写到磁盘,先写到内存里,那么失败时需要 redo
 - 基本上都用 Steal 和 No-Force 了
 







Write-Ahead Logging(WAL)


CheckPoints


Buffer Pool

Recovery

并发控制(Concurrency Control)实现 I
- 串行化:多个事务,内部保证顺序,但不保证事务的提交时间顺序
 - 线性化:一定按照提交时间出来。很难解决
 



脏读、不可重复读、幻读(Dirty|Unrepeatable|Phantom Read)




冲突(Conflict)
- 读-读冲突(R-R Conflict)
 - 读-写冲突(R-W Conflict)
 - 写-写冲突(W-W Conflict)
 
要保证并发执行的效果和串行执行的效果一致
保证 RR 高并发,保证 RW 不出错,保证 WW 不丢失





锁(Lock)



乐观锁和悲观锁(OCC 和 PCC)
- Optimistic concurrency control 乐观锁:就是先读出来,改完后看一下原数据有没有变动,如果有变动就不写回去,没变动再写回去
 - Pessimistic concurrencty control 悲观锁:就是传统的锁,用之前锁上,用完解锁
 




Two Phase Locking(2PL)
属于悲观锁。解决了 WW 冲突。
- 2PL:将锁拿齐之后再做处理。在锁释放前,申请另一个锁
 - 严格2PL:最后再释放锁,这是为了中途 abort 方便恢复
 



锁管理(Lock Management)



死锁(Deadlocks)





Multi-Version Concurrency Control(MVCC)
允许读到的不是最新的数据。
解决了 RW 冲突。




存储方式(Storage)




垃圾回收(Garbage Collection)
