深入理解RDBMS | 青训营笔记

97 阅读4分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第3篇笔记.

什么是RDBMS

RDBMS(关系型数据库)是目前使用最为广泛的数据库之一,同时也是整个信息化时代的基石。

数据库模型的发展史

  • 网状模型:用有向图表示实体和实体之间的联系的数据结构模型称为网状数据模型。
  • 层次模型:层次数据模型是用树状<层次>结构来组织数据的数据模型。
  • 关系模型:使用表格表示实体和实体之间关系的数据模型称之为关系数据模型。

image.png

事务特性ACID

  • 原子性(Atomicity):事务是一个不可再分割的工作单元,事务中的操作要么都发生,要么都不发生。
  • 一致性(Consistency):数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。
  • 隔离性(Isolation):多个事务并发访问时,事务之间是隔离的,一个事务不应该影响其它事务运行效果。
  • 持久性(Durability):在事务完成以后,该事务所对数据库所做的更改便持久的保存在数据库之中,并不会被回滚。

SQL执行流程

image.png

事物的隔离级别

1) Serializable (串行化):通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。
2) Repeatable read (可重复读):InnoDB默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行,解决了不可重复读的问题。(解决了不可重复读,还存在幻读) ★
3) Read committed (读已提交):一个事务只能看见已经提交事务所做的改变。可避免脏读的发生。 (Oracle等数据库默认级别)
4) Read uncommitted (读未提交):所有事务都可以看到其他未提交事务的执行结果。

binlog、redolog、undolog

bin log(二进制日志)

bin log是 MySQL 数据库级别的文件,记录对 MySQL 数据库执行修改的所有操作,不会记录 select 和 show 语句,主要用于恢复和同步数据库。

redo log(重做日志)

redo log是innodb引擎级别,用来记录 innodb 存储引擎的事务日志,不管事务是否提交都会记录下来,用于数据恢复。当数据库发生故障,innoDB 存储引擎会使用redo log恢复到发生故障前的时刻,以此来保证数据的完整性。将参数innodb_flush_log_at_tx_commit设置为 1,那么在执行 commit 时会将redo log同步写到磁盘。

undo log(回滚日志)

除了记录redo log外,当进行数据修改时还会记录undo log,undo log用于数据的撤回操作,它保留了记录修改前的内容。通过undo log可以实现事务回滚,并且可以根据undo log回溯到某个特定的版本的数据,实现MVCC。

Binlog和redolog区别:

a. bin log会记录所有日志记录,包括 InnoDB、MyISAM 等存储引擎的日志;redo log只记录 innoDB 自身的事务日志。
b. bin log只在事务提交前写入到磁盘,一个事务只写一次;而在事务进行过程,会有redo log不断写入磁盘。
c. bin log是逻辑日志,记录的是SQL语句的原始逻辑;redo log是物理日志,记录的是在某个数据页上做了什么修改。

索引

索引是存储引擎用于提高数据库表的访问速度的一种数据结构。

什么情况下需要建索引?

1)经常用于查询的字段
2)经常用于连接的字段建立索引,可以加快连接的速度
3)经常需要排序的字段建立索引,因为索引已经排好序,可以加快排序查询速度

什么情况下不建索引?

1)where条件中用不到的字段不适合建立索引
2)表记录较少
3)需要经常增删改
4)参与列计算的列不适合建索引
5)区分度不高的字段不适合建立索引,如性别等

索引作用

数据是存储在磁盘上的,查询数据时,如果没有索引,会加载所有的数据到内存,依次进行检索,读取磁盘次数较多。有了索引,就不需要加载所有数据,因为 B+ 树的高度一般在 2-4 层,最多只需要读取 2-4 次磁盘,查询速度大大提升。