术语与基本概念
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 冲突。