这是我参与「第五届青训营 」伴学笔记创作活动的第16 天
概述
什么是RDBMS?
RDBMS 是 Relational Database Management System 的缩写,中文译为“关系数据库管理系统”,它是 SQL 语言以及所有现代数据库系统(例如 SQL Server、DB2、Oracle、MySQL 和 Microsoft Access)的基础。
事务 ACID
事务(Transaction):是由一组SQL语句组成的一个程序执行单元(Unit),它需要满足ACID特性。
B
UPDATE account_table SET balance = balance - '小目标' WHERE name = '抖音';
UPDATE account_table SET balance = balance + '小目标' WHERE name = 'view6view';
COMMIT;
- 原子性Atomicity:事务是一个不可再分割的工作单元,事务中的操作要么都发生,要么都不发生
- 一致性Consisitency:数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性
- 隔离型Isolation:可以隔离多个并发事务,避免影响
- 持久性Durability:事务一旦提交成功,数据保持持久性,不会被回滚
发展历史
前DBMS时代
人工管理
文件系统
DBMS时代
1960s,传统的文件系统已经不能满足人们的需求,数据库仓库系统(DBMS)应运而生
DBMS:按照某种数据模型来组织、存储和管理数据的仓库
- 网状数据库
- 层次数据库
- 关系数据库
几种数据模型对比
SQL 语言
1974年IBM的Ray Boyce 和 Don Chamberlin将Code关系数据库的12条准则的数学定义以简单的关键字语法表现出来,里程碑式的提出了SQL(Structured Query Language)语言。
- 语法风格接近自然语言
- 高度非过程化
- 面向集合的操作方式
- 语言简洁,易学易用
一条SQL的一生
- SQL 引擎
- 存储引擎
- 事务引擎
关键技术
SQL引擎
Parser
解析器(Parser)一般分为词法分析(Lexical analysis)、语法分析(Syntax analysis)、语义分析(Semantic analyzer)等步骤。
存储引擎-InnoDB
In-Memory:
- Buffer Pool
- Change Buffer
- Adaptive Hash Index
- Log Buffer
On-Disk:
- System Tablespace(ibdata1)
- General Tablespaces(xxx.ibd)
- Undo Tablespaces(xxx.ibu)
- Temporary Tablespaces(xxx.ibt)
- Redo Log(ib_logfileN)
Buffer Pool
MySQL中每个chunk的大小一般为128M,一个chunk下面有8192个block,每个block对应一个page(每个page16k),这样可以避免内存碎片化
分成多个instance,可以有效避免并发冲突,Page id % instance num得到它属于哪个instance
当buffer pool里的页面都被使用之后,再需要换存其他页面怎么办?淘汰已有的页面
基于什么规则淘汰:淘汰那个最近一段时间最少被访问过的缓存页了, 这种思想就是典型的LRU算法了
普通的LRU算法存在缺陷,考虑我们需要扫描100GB的表,而我们的buffer pool只有1GB,这样就会因为全表扫描的数据量大,需要淘汰的缓存页多,导致在淘汰的过程中,极有可能将需要频繁使用到的缓存页给淘汰了,而放进来的新数据却是使用频率很低的数据
MySQL确实没有直接使用LRU算法,而是在LRU算法上进行了优化
- MySQL的优化思路就是:对数据进行冷热分离,将LRU链表分成两部分,一部分用来存放冷数据, 也就是刚从磁盘读进来的数据,另一部分用来存放热点数据, 也就是经常被访问到数据
- 当从磁盘读取数据页后,会先将数据页存放到LRU链表冷数据区的头部,如果这些缓存页在1秒之后被访问,那么就将缓存页移动到热数据区的头部:如果是1秒之内被访问,则不会移动,缓存页仍然处于冷数据区中
- 淘汰时,首先淘汰冷数据区
B+ Tree
InnoDB 引擎存储数据的时候,是以页为单位的
页面内(非叶子节点page):页目录中使用二分法快速定位到对应的槽,然后再遍历该槽对应分组(叶子节点page)中的记录即可快速找到指定的记录。
从根到叶:中间节点存储
点查:
Select * from table wehre id = 2000;
范围查询:
Select * from table wehre id > 2000;
事务引擎
Atomicity 与 Undo Log
BEGIN;
UPDATE account table SET balance = balance - '小目标WHERE name =抖音';
## Server crush
UPDATE account_ table SET balance = balance +'小目标’WHERE name =‘杨洋';
COMMIT ;
如何将数据库回退到修改之前的状态?
undolog:Undo Log是逻辑日志,记录的是数据的增量变化。利用Undo Log可以进行事务回滚,从而保证事务的原子性。同时也实现了多版本并发控制(MVCC)解决读写冲突和一致性读的问题。
Isolation 与 锁
用户从抖音抢了一个亿红包,又从头条抢了一个亿。抖音和头条都要往羊老师的账户转一个亿, 如果两个操作同时进行,发生冲突怎么办?
读写是否冲突?
读写互不阻塞,MVCC机制
Isolation 与 MVVC
事务还没提交之前,它对数据做的修改,不应该被其他人看到
MVCC的意义:
- 读写互不阻塞
- 降低死锁概率
- 实现一致性读
Undo Log在MVCC的作用:
- 每个事务有一个单增的事务ID
- 数据页的行记录中包含了DB ROW ID,DB TRX_ ID,DB ROLL PTR
- DB_ ROLL PTR将数据行的所有快照记录都通过链表的结构串联了起来