当前位置:首页 > 经验 >

数据库系统原理学习(数据库系统概论学习方法)

来源:原点资讯(www.yd166.com)时间:2022-11-06 09:32:53作者:YD166手机阅读>>

一个查询语句的例子

在执行下面这个查询语句时的执行的流程是怎么样的?

MySQL> select * from t where id=1;

执行器的执行流程是这样的:

1.调用 InnoDB 引擎接口取这个表的第一行,判断 id 值是不是 1,如果不是则跳过,如果是则将这行存在结果集中;

2.调用引擎接口取“下一行”,重复相同的判断逻辑,直到取到这个表的最后一行。

3.执行器将上述遍历过程中所有满足条件的行组成的记录集作为结果集返回给客户端。

一个 SQL 的执行过程为:

1.连接 2.查询缓存 3.词法分析 4.语法分析 5.语义分析 6.构造执行树 7.生成执行计划 8.执行器执行计划 9.返回执行结果

一个更新语句的例子

更新语句:

mysql> update table set c = c 1 where id = 2;

执行流程:

1.执行器先找引擎取 ID=2 这一行。ID 是主键,引擎直接用树搜索找到这一行。如果 ID=2 这一行所在的数据页本来就在内存中,就直接返回给执行器;否则,需要先从磁盘读入内存,然后再返回。 2.执行器拿到引擎给的行数据,把这个值加上1,比如原来是N,现在就是N 1,得到新的一行数据,再调用引擎接口写入这行新数据。 3.引擎将这行新数据更新到内存中,同时将这个更新操作记录到 redo log 里面,此时 redo log 处于 prepare 状态。然后告知执行器执行完成了,随时可以提交事务。 4.执行器生成这个操作的 binlog,并把 binlog 写入磁盘。 5.执行器调用引擎的提交事务接口,引擎把刚刚写入的 redo log 改成提交(commit)状态,更新完成。

query和update执行流程不一样的在于 update涉及了日志模块,binlog (归档日志)和 redo log (重做日志)。

两阶段提交

redo log 的写入拆成了两个步骤:prepare 和 commit,这就是"两阶段提交"。

为什么必须有“两阶段提交”呢?这是为了让两份日志之间的逻辑一致。

由于 redo log 和 binlog 是两个独立的逻辑,如果不用两阶段提交,要么就是先写完 redo log 再写 binlog,或者采用反过来的顺序。我们看看这两种方式会有什么问题。

仍然用前面的 update 语句来做例子。假设当前 ID=2 的行,字段 c 的值是 0,再假设执行 update语句过程中在写完第一个日志后,第二个日志还没有写完期间发生了 crash,会出现什么情况呢?

数据库系统原理学习,数据库系统概论学习方法(1)

情况 1 :先写 redo log 后写 binlog。

假设在 redo log 写完,binlog 还没有写完的时候,MySQL 进程异常重启。由于我们前面说过的,redo log 写完之后,系统即使崩溃,仍然能够把数据恢复回来,所以恢复后这一行 c 的值是 1。但是由于 binlog 没写完就 crash 了,这时候 binlog 里面就没有记录这个语句。因此,之后备份日志的时候,存起来的 binlog 里面就没有这条语句。然后你会发现,如果需要用这个 binlog 来恢复临时库的话,由于这个语句的 binlog 丢失,这个临时库就会少了这一次更新,恢复出来的这一行 c 的值就是 0,与原库的值不同。

情况 2:先写 binlog 后写 redo log。

如果在 binlog 写完之后 crash,由于 redo log 还没写,崩溃恢复以后这个事务无效,所以这一行 c 的值是 0。但是 binlog 里面已经记录了“把 c 从 0 改成 1”这个日志。所以,在之后用 binlog 来恢复的时候就多了一个事务出来,恢复出来的这一行 c 的值就是 1,与原库的值不同。

可以看到,如果不使用“两阶段提交”,那么数据库的状态就有可能和用它的日志恢复出来的库的状态不一致。

MySQL逻辑架构

MySQL是一个开放源代码的关系数据库管理系统。原开发者为瑞典的MySQL AB公司,最早是在2001年MySQL3.23进入到管理员的视野并在之后获得广泛的应用。

当MySQL启动(MySQL服务器就是一个进程),等待客户端连接,每一个客户端连接请求,服务器都会新建一个线程处理(如果是线程池的话,则是分配一个空的线程),每个线程独立,拥有各自的内存处理空间。

数据库系统原理学习,数据库系统概论学习方法(2)

MySQL总体上可分为Server层和存储引擎层。

Server层包括连接器、查询器、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。

存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持 InnoDB、MyISAM、Memory 等多个存储引擎。

如果能在头脑中构建一幅MySQL各组件之间如何协同工作的架构图,有助于深入理解MySQL服务器。下图展示了MySQL的逻辑架构图。

数据库系统原理学习,数据库系统概论学习方法(3)

MySQL 整体上可以分为 Server 层和存储引擎层两部分。详细的分层如下:

1.客户端层:连接处理、授权认证、安全等功能均在这一层处理。包含本地sock通信和大多数基于客户端/服务端工具实现的类似于tcp/ip的通信。主要完成一些类似于连接处理、授权认证、及相关的安全方案。在该层上引入了线程池的概念,为通过认证安全接入的客户端提供线程。同样在该层上可以实现基于SSL的安全链接。服务器也会为安全接入的每个客户端验证它所具有的操作权限。

2.核心服务层:查询解析、分析、优化、缓存、内置函数(比如:时间、数学、加密等函数)等。该层架构主要完成核心服务功能,如SQL接口,并完成缓存的查询,SQL的分析和优化及部分内置函数的执行。所有跨存储引擎的功能也在这一层实现,如过程、函数等。在该层,服务器会解析查询并创建相应的内部解析树,并对其完成相应的优化如确定查询表的顺序,是否利用索引等,最后生成相应的执行操作。如果是select语句,服务器还会查询内部的缓存。如果缓存空间足够大,这样在解决大量读操作的环境中能够很好的提升系统的性能。

3.存储引擎层:存储过程、触发器、视图等。存储引擎真正的负责了MySQL中数据的存储和提取,服务器通过API与存储引擎进行通信。不同的存储引擎具有的功能不同,这样我们可以根据自己的实际需要进行选取。

4.数据存储层,主要是将数据存储在运行于裸设备的文件系统之上,并完成与存储引擎的交互。

最下层为存储引擎,其负责MySQL中的数据存储和提取。和Linux下的文件系统类似,每种存储引擎都有其优势和劣势。中间的服务层通过API与存储引擎通信,这些API接口屏蔽了不同存储引擎间的差异。

MySQL查询过程

我们总是希望MySQL能够获得更高的查询性能,最好的办法是弄清楚MySQL是如何优化和执行查询的。一旦理解了这一点,就会发现:很多的查询优化工作实际上就是遵循一些原则让MySQL的优化器能够按照预想的合理方式运行而已。

当向MySQL发送一个请求的时候,MySQL到底做了些什么呢?

数据库系统原理学习,数据库系统概论学习方法(4)

首页 123下一页

栏目热文

数据库系统基础(数据库系统基础笔记)

数据库系统基础(数据库系统基础笔记)

1、数据库底层MySQL数据库的底层是B 树。说到B 树,先说下B树,B树也叫多路平衡查找树,所有的叶子节点位于同一层,...

2022-11-06 10:09:42查看全文 >>

数据库系统典型架构(数据库系统设计框架)

数据库系统典型架构(数据库系统设计框架)

本文,将介绍数据库架构设计中的一些基本概念,常见问题以及对应解决方案,为了便于读者理解,将以“用户中心”数据库为例,讲解...

2022-11-06 10:07:43查看全文 >>

数据库系统原理及应用(数据库系统发展过程)

数据库系统原理及应用(数据库系统发展过程)

一、摘要本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题。特别需要说明的是,MySQL支持诸多存储引擎,...

2022-11-06 10:00:09查看全文 >>

数据库系统原理课后题(数据库系统的基本原理答案)

数据库系统原理课后题(数据库系统的基本原理答案)

更多真题详情可联系冯老师,...

2022-11-06 09:43:00查看全文 >>

数据库系统原理详细版(数据库的原理图解)

数据库系统原理详细版(数据库的原理图解)

数据库系统原理【课程代码:04735】模拟测试《数据库系统原理》模拟测试一一、单项选择题:本大题共 15 小题,每小题 ...

2022-11-06 09:51:32查看全文 >>

常见的数据库系统(目前流行的数据库系统有哪些)

常见的数据库系统(目前流行的数据库系统有哪些)

图片来源@视觉中国文 | 钛资本研究院中国数据库市场将迎来高增长态势,原因有四点:首先是政策利好,国家大力支持国产数据库...

2022-11-06 10:07:38查看全文 >>

梦见好多熟肉是啥意思(梦见好多熟肉好吗)

梦见好多熟肉是啥意思(梦见好多熟肉好吗)

呼。洛倾城缓缓吐出一口浊气,嘴角泛起一丝微笑。如果没有一代老祖的帮助,别说剑痴了,就算叶尘她都打不过。武灵儿与忘仙宗众弟...

2022-11-06 09:55:30查看全文 >>

梦见生肉和熟肉是什么意思(梦见自己吃熟肉是啥意思)

梦见生肉和熟肉是什么意思(梦见自己吃熟肉是啥意思)

(内容有些专业,感兴趣的读者请耐心理解看完!想直接看解梦的读者,可以拉倒中后部分)做梦,对我们来说都不陌生。有时候我们会...

2022-11-06 09:55:43查看全文 >>

正宗重庆粉蒸排骨正宗做法(正宗的重庆粉蒸排骨怎样做好吃)

正宗重庆粉蒸排骨正宗做法(正宗的重庆粉蒸排骨怎样做好吃)

粉蒸排骨是一道四川的汉族名菜,属于川菜。鲜嫩的排骨,再加上软糯的米粉,吃起来鲜香美味,肥而不腻,软烂入味,让人回味无穷...

2022-11-06 09:48:36查看全文 >>

重庆粉蒸排骨的做法视频(正宗重庆粉蒸排骨做法教学视频)

重庆粉蒸排骨的做法视频(正宗重庆粉蒸排骨做法教学视频)

大家好,粉蒸排骨相信很多地方的人们都很喜欢吃,那么对于广西人的粉蒸排骨制作方法,不知道你们会不会做呢?如果你是一个很爱吃...

2022-11-06 09:59:40查看全文 >>

文档排行