深入理解RDBMS| 青训营笔记

29 阅读5分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第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时代

人工管理

image.png

文件系统

image.png

DBMS时代

1960s,传统的文件系统已经不能满足人们的需求,数据库仓库系统(DBMS)应运而生

DBMS:按照某种数据模型来组织、存储和管理数据的仓库

  • 网状数据库
  • 层次数据库
  • 关系数据库

image.png

几种数据模型对比

image.png

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将数据行的所有快照记录都通过链表的结构串联了起来