MySQL-深入理解RDBMS | 青训营笔记

107 阅读4分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天。

前言

RDBMS(关系型数据库)是目前使用最为广泛的数据库之一,同时也是整个信息化时代的基石。本节课程通过生活中常见的场景向大家介绍RDBMS的作用、发展历程等。接着将分别从 SQL 执行流程、 SQL 引擎、存储引擎及事务引擎出发,讲解储存与数据库的核心技术。最后,作为国内数据规模最大的互联网公司之一,字节内部有成千上万套RDBMS系统,这里以红包雨为案例为主,展示了字节是如何解决大流量、流量突增、高可靠等问题。

经典案例

RDBMS 事务 ACID

  • 事务(Transaction):是由一组SQL语句组成的一个程序执行单元(Unit),它需要满足ACID特性。
BEGIN;
UPDATE account_ table SET balance = balance - '小目标' WHERE name ='抖音' ;
UPDATE account_ table SET balance = balance + '小目标' WHERE name ='杨洋' ;
COMMIT;

这些语句组合在一起就形成了一个程序的执行单元,也就是上述所说的“事务”。

  • ACID:

    • 原子性(A tomicity):事务是一个不可再分割的工作单元,事务中的操作要么都发生,要么都不发生。

    • 一致性(C onsistency):数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。

    • 隔离性(I solation):多个事务并发访问时,事务之间是隔离的,一个事务不应该影响其它事务运行效果。

    • 持久性(D urability):在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。

DBMS的发展历程

DBMS数据模型

网状模型层次模型关系模型
优势能直接描述现实世界;存取效率较高结构简单;查询效率高;可以提供较好的完整性支持实体及实体间的的联系都通过二维表结构表示;可以方便的表示M:N关系;数据访问路径对用户透明
劣势结构复杂;用户不易使用;访问程序设计复杂无法表示M:N的关系;插入、删除限制多;遍历子节点必须经过父节点;访问程序设计复杂关联查询效率不够高;关系必须规范化

SQL语言

1974年IBM的Ray Boyce和Don Chamberlin将Codd关系数据库的12条准则的数学定义以简单的关键字语法表现出来,里程碑式地提出了SQL(Structured Query Language)语言。

  • SQL语言的优势

    • 语法风格接近自然语言

    • 高度非过程化

      非关系数据模型的数据操纵语言是面向过程的语言,用其完成用户请求时,必须指定存取路径。而用SQL进行数据操作,用户只需提出”做什么”,而不必指明“怎么做”,因此用户无须了解存取路径,存取路径的选择以及SQL语句的操作过程由系统自动完成。这不但大大减轻了用户负担,而且有利于提高数据独立性。

    • 面向集合的操作方式

      SQL采用集合操作方式,不仅查找结果可以是元组的集合,而且一次插入、删除、更新操作的对象也可以是元组的集合。

    • 语言简洁,易学易用

      SQL功能极强,但由于设计巧妙,语言十分简洁,完成数据定义、数据操纵、数据控制的核心功能只用了9个动词: CREATE、ALTER、 DROP、SELECT、 INSERT、 UPDATE、 DELETE、 GRANT、REVOKE。 且SQL语言语法简单, 接近英语口语,因此容易学习,也容易使用。

关键技术

  • SQL引擎

    • 查询解析: SQL 语言接近自然语言,入门容易。但是各种关键字、操作符组合起来,可以表达丰富的语意。因此想要处理SQL命令 ,首先将文本解析成结构化数据,也就是抽象语法树(AST)

    • 查询优化: SQL是一门表意的语言,只是说「要做什么」,而不说「怎么做]。所以需要一些复杂的逻辑选择「如何拿数据」,也就是选择一个好的查询计划。 优化器的作用根据AST优化产生最优执行计划(Plan Tree)

    • 查询执行:根据查询计划,完成数据读取、处理、写入等操作。

    • 事务引擎:处理事务-致性、并发、读写隔离等

    • 存储引擎:内存中的数据缓存区、数据文件、日志文件

引用参考

  1. A Relational Model of Data for Large Shared Data Banks

  2. Readings in Database Systems(Fifth Edition)

  3. 字节跳动内部课程 juejin.cn/course/byte…