关系型数据库管理系统
存储方式的演变
从人工管理阶段->文件系统阶段->数据库阶段。在数据库阶段,管理数据的软件叫做数据库管理系统。数据按照一定格式保存,通过这个软件可以方便的对数据进行增删查改操作,从而极大的提升了数据管理效率。
数据库系统架构
前端
SQL Parser(SQL解析)、Query Optimizer(产生可行的query plan,选择最佳query plan)
后端
存储引擎
负责如何在硬盘上存储数据、如何高效地访问硬盘上的数据。
MySQL服务器程序是真实数据的管理者,负责解析各个客户端发来的各种请求并返回相应的执行结果。MySQL服务器程序是MySQL数据库实例,简称数据库实例。
客户端和服务器通信方式:TCP/IP、命名管道和共享内存、Unix套接字。
Buffer Pool
在内存中缓存硬盘的数据。
- Temporal locality(时间局部性)
- Spatial locality(空间局部性)
Execution Engine
根据query plan,完成相应的运算和操作。
Transaction managemennt(事务管理)
目标是实现ACID。进行logging写日志,locking加锁;保证并行transactions事务的正确性。
数据存储与访问
数据表(Table)
通过表格来存放数据,而且不同的表格可以通过某种关系联系起来。这种数据库管理系统也称为关系型数据库管理系统。
索引(Index)
Tree based index:有序,支持点查询和范围查询。B+Tree。
- 每个节点是一个page。
- 所有key存储在叶子结点。
- 内部节点完全是索引作用。
Hash based index:无序,只支持点查询。
Clustered index(主索引)与Secondary index(二级索引)。
- Clustered:记录存储在index中,记录顺序就是index顺序。以主键值的大小为页和记录的排序规则,在叶子节点处存储的记录包含了表中所有的列。
- Secondary:记录顺序不是index顺序。以自定义的列的大小为页和记录的排序规则,在叶子节点处存储的记录内容是列+主键。
缓冲池(Buffer pool)
提高性能,减少I/O。
替换策略:Random、FIFO、LRU。
运算的实现
Selection/Projection:行的过滤,列的提取。
Join
- Nested loop
- Hashing:对R和S进行partitioning,然后对分在相同的partitioning进行hash join。
- Sorting
事务处理
ACID
Atomicity(原子性)、Consistenncy(一致性)、Isolation(隔离性)、Durability(持久性)
并发控制
数据冲突引起的问题:读脏数据(写读)(事务隔离级别调整到READ COMMITED)、不可重复读(读写)(事务隔离级别调整到REPEATABLE READ)、更新丢失(写写)、幻像读(读写)(事务隔离级别调整到SERIALIZATION)。
解决方法:乐观(读数据到私有工作区,在工作区完成事务处理;,检测是否与其他事务冲突;如果没有冲突,那么把私有工作区的修改更新到数据库公共数据中)、悲观(加锁,读写锁不同)。
持久性
WAL(Write Ahead Logging):logging优先于实际的操作。日志记录先于修改后的数据出现在硬盘上。
Crash Recovery(崩溃恢复)
恢复点、logging。
种类
Oracel、DB2、SQL Server、PostgreSQL(开源)和MySQL(开源)。
数据仓库
star schema:一个fact table,多个dimension table。
Roll up:某维上求和;Drill down:某维分解。Slice:某维上选一个值;Dice:多维上选多个值。
行式与列式数据库。
分布式数据库
系统架构
Shared memory,Shard disk,Shard nothing。
一般是Shard nothing。
系统类型
Client/Servet、P2P、Master/Workers
CAP定理
Connsistency(多份数据一致性)、Availability(可用性)、Partition tolerance(容忍网络断开)三者不可得兼。