首页>>科技 >>内容

关系型数据库系统的构成,10张图带你轻松理解关系型数据库系统的工作原理

发布时间:2023-09-16 16:28:09编辑:温柔的背包来源:

很多朋友对关系型数据库系统的构成,10张图带你轻松理解关系型数据库系统的工作原理不是很了解,每日小编刚好整理了这方面的知识,今天就来带大家一探究竟。

关系型数据库系统的构成,10张图带你轻松理解关系型数据库系统的工作原理

什么是索引索引是一种有助于减少数据查询时间的数据结构。索引以额外的存储、内存和保持更新(较慢的写入速度)成本来实现这一点,从而使我们能够跳过检查表的每一行的繁琐任务。

就像书后的索引页一样,它可以帮助您找到正确的页面。

为什么需要索引少量数据是可以管理的(例如小班的考勤表),但是当数据量变大时(例如大城市的出生登记),事情就不那么容易了。以前非常快的操作开始减慢。

想象一下,如果您需要在一页A4 纸的列表中查找某些内容,而不是在数千页的列表中查找某些内容,那么您的查询策略将会发生怎样的变化。

无论你想到什么查询策略,几乎总会有一个数据库在某个时间点使用与你类似的策略,因为随着它们的增长,它们需要收集和存储的数据逐渐变大。你最终还是会遇到上面的问题。

因此,我们需要索引来帮助我们尽快获取我们需要的相关数据。

索引如何运作?

一般来说,索引越多,读取性能越好,但这是以降低写入性能为代价的,因为您需要保持索引更新。

一种解决方案是基于查询方法维护数据存储逻辑。例如,如果您需要按名称查询列表,则按名称对列表进行排序。但这个策略有很多问题需要考虑:

如果我有多种查询方法怎么办?例如,姓名查询和身份证查询都使用。如果写入新数据,写入速度会受到多大影响?如何处理数据更新?所有数据操作的复杂度是多少?无论你最初的策略是什么,你肯定需要一种方法来维护数据的顺序,以便获取相关的无序数据。

如下表的例子所示,通过扫描全表,几乎不需要时间就能查询出我们想要的数据。

++++|编号|名称|城市|++ ++| 1 |马赫迪|渥太华|| 2 |埃隆|火星|| 3 |杰夫|轨道|| 4 |克莱|奥克兰|| 5 |勒布朗|洛杉矶|++++ 添加到存储的数据大小无法完全存储在记忆。或者将数据从磁盘加载到内存需要很长时间?如下表所示,数据分散在磁盘上,无法完整加载到内存中。

++++|编号|名称|城市|+ +++| 1 |马赫迪|渥太华|| 2 |埃隆|火星|| 3 |杰夫|轨道|| 4 |克莱|奥克兰|| 5 |勒布朗|洛杉矶|| . | . | . || 1000000 |斯蒂芬|旧金山|| 1001000 |莱纳斯|波特兰|++++大多数RD 我立刻想到我们需要一个字典(哈希表)和一种无需扫描磁盘即可直接定位到正在查询的指定行的方法。

索引叶节点提供指定列到索引的映射,可以存储符合条件的行的位置。

RowIDs 索引映射到表数据

这些索引叶节点是索引列和相应行在磁盘上的位置之间的映射。它提供了一种通过对列进行索引来获取特定行的快速方法。扫描索引会更快,因为它是您正在搜索的列的紧凑表示(更少的字节)。它可以节省您读取一堆块来查找所需数据的时间,并且更容易缓存,从而进一步加快整个过程。

这些索引的叶节点大小统一,我们在每个块中存储尽可能多的叶节点。由于这种结构需要对数据进行排序(逻辑上,而不是磁盘上的物理排序),因此我们需要解决必须快速添加和删除数据的问题。通常我们使用双向链表来解决这个问题。

这里的好处是双重的:它允许我们向前和向后读取索引叶节点,并在删除或添加新行时快速重建索引结构,因为我们只是修改指针。

由于这些叶节点在磁盘上不是按顺序排列的,因此我们需要一种方法来获取正确的索引叶节点。

平衡树(B树)

B 树VS B+ 树

《B树VSB+树》

B+树的主要区别在于中间节点中不存储数据。所有数据引用都链接到叶子节点,可以更好地缓存树结构(中间节点数据较小,更容易缓存索引信息)。

其次,B+树叶子节点是链接的,所以如果需要做索引扫描,可以简单地线性遍历,而不用上下遍历整棵树,从磁盘加载更多的索引数据。

在关系数据库中,B+树的结构如下:

数据库中的B+树

什么是交易?事务是数据库操作的基本单位。它要么完全成功,要么完全失败。不存在部分成功和部分失败的可能性。

数据不一致在不同的数据隔离级别下,可能会出现一些数据不一致的情况。了解这些现象对于调试系统和了解系统可以容忍什么样的不一致至关重要。

不可重复读取

不可重复读

如上图所示,如果在事务中的两次后续读取之间无法获得一致的数据视图,则会发生不可重复读取。在某些模式下,并发的数据库操作可能会导致刚刚读取的值被修改,从而导致不可重复读。

脏读

脏读

类似地,当您执行读取并且另一个事务更新同一行但不提交工作时,您执行另一次读取并且可以访问未提交(脏)值(这不是持久状态更改,与状态的状态不一致)数据库),就会发生脏读。

幻读

幻读

幻读是另一种已提交的数据不一致现象,经常出现在处理数据统计的场景中。例如,您在特定交易中对客户总数进行了两次计数。在两次连续读取之间,另一个客户注册或删除他们的帐户(已提交),如果您的数据库不支持这些事务的范围锁,这将导致您获得两个不同的值。

隔离级别

SQL 标准的四种隔离级别

SQL标准定义了4个标准隔离级别,它们可以而且应该全局配置(如果我们不可靠地知道隔离级别,就会发生一些奇怪的问题)。

可重复读(REPEATABLE READ) 在该隔离级别下,保证在一个事务中多次读取相同数据时,得到的结果是一致的。

这意味着一个事务在启动时会创建一个一致的快照,然后其他事务对数据的修改直到该事务结束都不会影响该事务的读取结果。

在可重复读层面,解决了不可重复读的问题,但可能会出现幻读。

可串行化(SERIALIZABLE) 这是最高的隔离级别,它确保事务之间的并发执行就好像它们是顺序执行的一样。

在这个级别上,事务是串行执行的,避免了脏读、不可重复读和幻读的问题。

虽然序列化提供了最高的数据一致性,但它也牺牲了并发性能,因为事务必须顺序执行,无法并行处理。

已提交读(READ COMMITTED) 在此隔离级别下,事务只能读取已提交的数据。这意味着脏读问题得到解决,因为事务只能看到其他事务已经提交的数据。

然而,在这个级别,可能会出现不可重复读取的问题。

读取未提交在此隔离级别下,一个事务可以读取另一事务尚未提交的数据。这意味着事务可能会读取脏数据(未提交的数据),即脏读。

此级别提供最小程度的隔离,允许并发事务相互干扰。

以上知识分享希望能够帮助到大家!