数据库存储介绍

article/2025/10/22 10:23:44

数据存储在存储设备中,在实际应用中,有多种存储设备,下面我们一一介绍。同时在保存数据时,有特定的组织方式,在下面我也做简单介绍。

一 存储设备介绍

1.1     高速缓存

Cache,计算机拥有1M或跟多的高速缓存。现在的计算机一般有一级缓存、二级缓存、三级缓存。也可称为L1、L2、L3。当处理器需要数据和指令时,数据和指令就从内存移到高速缓存中。处理器访问高速缓存的时间只需几纳秒。

1.2     主存设备

也就是我们平常说的内存。

此处插播一点,为什么32的系统最多只支持4G的内存?因为32位的系统配合32位的CPU,寻址空间为2^32次方,计算出来为4294967296字节。也就是4G,所以32为的系统只支持4G内存,如果是64为的系统配合64位的CPU,则寻址空间为2^64次方,得到18446744073709551616字节,此时,内存已经不会有支持上的限制。

发生在计算机上的任何一件事情,都是作用于驻留在内存中的信息上。将数据从内存转移到处理器或高速缓存的速度在10~10ns的范围内。

1.3     辅助存储器

即磁盘,硬盘。在磁盘和内存中传送一个字节的速度在10ms左右,一次可以传送多个字节。数据主要存储在辅助存储器中。

1.4     第三级存储器

用来保存大量的数据,读写速度要慢于磁盘,但是容量大于磁盘的容量甚至是多个磁盘的容量,每个字节的花费要小于磁盘的花费。

二 数据存储方式

数据被保留在磁盘中,不论是操作系统的数据,还是数据库的数据。磁盘被划分为磁盘块(或像操作系统称为页),每块的大小是4~64KB,数据库在块上保存数据,整个块被从一个称为缓冲区的连续内存区域内移进或移出。

一般情况下,一个磁盘块仅存放一个关系的元组,也就是一个磁盘块,保存表的一条数据。当然也可以在一个磁盘块上保存数个关系的元组,但一般情况下,并不如此。同时,如果一个磁盘块放不下一个关系的元组,则需要多个磁盘块来保存这一个关系的元组,如一个BLOB字段,肯定需要多个磁盘块来保存。

在Oracle中,数据块会按照如下的方式来组织存放数据:

        

       在Oracle中,使用块存储数据时,有两个重要的概念需要注意,行迁移和行链接。

       行迁移:当一个块中已存在的数据被UPDATE为很大的数据而导致这个块没有空间存放这条记录时,Oracle就会把这条数据迁移到一个能存放下的其他块中,同时在原先的块中保留这个新块的地址。

       行链接:初始插入的数据太大了,而导致一个块不能存放整体数据,需要多个块来存放这条数据。

       这两种情况都会导致数据查询速度变慢,具体的我会在SQL调优的主题里说明。

三 特定数据库对象的存储实现

       此处以表为例,说明在Oracle中,表如何存放。

       Oracle中的表细分的话,可以分为如下9类(参考Oracle11G):

堆组织表、索引组织表、索引聚簇表、散列聚簇表、有序散列聚簇表、嵌套表、临时表、对象表、外部

之所以有这么多种类的表,都是为了数据的存储、查询或特殊处理而设计的,此处我通过堆组织表和索引组织表为例,说明数据具体存放的方式。

堆组织表:堆是计算机科学中一种重要的经典的数据结构,可以简单理解为一个很大的磁盘空间,以一种显示随机的方式来管理数据。堆表最显著的特点是:数据会存放在最合适的地方,而不是以某种特定顺序来放置。日常工作中,大部分表都是堆组织表。

当你插入一条数据时,数据库不会考虑将其放在某个你“想要”的位置(如我插入一条ID为1的记录和ID为2的记录在磁盘上“挨着”,连续存储),而是将其放在数据库认为最合适的位置,比如有一个块正好可以存放此条记录,则将其放在这个快上,而这个快可能和这个表的其他数据存放的块毫无关系(不在一个块上),“距离”也可能很远。只要有空间,数据会存放在任何位置。

优点:随机存储,这样可以很快的将数据写到磁盘上,相比你要将数据放到指定的位置,会少一个寻找磁盘的时间。

缺点:当扫描大范围的数据时,需要扫描很多磁盘块,再将这些快聚集到一块返回到内存中,此时会占用很多时间。

关于在使用堆表调优的方法,我会在博客的其他文章中进行介绍。

       索引组织表:又称为IOT(index organized table),就是存储在一个索引组织中的表。此处呀区别堆表,堆表数据的存储是无序的,可以存放在磁盘的任何位置;IOT中数据则按照主键存储和排序。在IOT中,数据和索引存储在相同的位置。索引就是数据,数据就是索引。

       当你插入数据时,这些数据的存储必然是按照主键来进行排序存储的,如ID分别为1和2的数据,在先后插入到表中时,存放的位置必然是在一个磁盘块或相邻的磁盘块中。

       优点:读取数据时,只需读取索引就能得到数据

       缺点:存储数据时,需要先对数据进行组织(对主键进行排序,确定记录存放在磁盘上的位置),才能将确定数据的存储位置,此时会浪费一定的时间。

       特定的表可以设计为索引组织表,一般将一些很少修改但会大量读取的小表设计为索引组织表,如码表。

 
      深得东西大家可以细细挖掘,了解了数据库的数据存储方式,才能对我们的调优,管理有所帮助。

注1:图片来源于网络

注2:本文的大部分内容来自书籍《数据库系统实现》

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/24816552/viewspace-1313802/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/24816552/viewspace-1313802/


http://chatgpt.dhexx.cn/article/itkPa9KD.shtml

相关文章

Excel|给某一列添加同一个字

如图所示给新型冠状病毒肺炎数据中“武汉”这一列都加上“市”字: 先在D列打两行:“武汉市”、“孝感市” 然后在D3按CtrlE,即可全部填充 ps:如果删除某列同一个字的话用替换即可

鼠标单击就选中一个字的解决办法

有时候我们想在两个字中间插入一个字,点击鼠标时却总是选中一个字。 解决办法: 按一下键盘的Insert键就好了。 造成这种情况的原因:极大可能是因为我们删除文字时不小心碰到了Insert键。 看完如果对你有帮助,感谢点赞支持&…

什么是字节

** 什么是字节 ** 位(bit):是计算机 内部数据 存储的最小单位 11001100是一个八位数的二进制数。 字节(byte ):是计算机中 数据处理的基本单位,习惯上用大写B来表示; 1B(byte,字节…

关于“一个字等于多少字节?“的问题解答

网上有人说这个问法不严谨,我觉得严格说确实是这样,但是我个人觉得不能这样说! 举个例子,这个问题就好比你上初中的时候那些证明题很多其实是很不严谨的,但是限于知识体系,到高中你会发现好像不是那么一回…

键盘打字时,打一个字后面少一个字如何解决

键盘敲字时,如果光标在中间,输入一个字后面就少一个字 文字输入的例子 只需要按INS键就可以恢复正常了 注:如果是手提笔记本电脑,一个键盘有两下两行,先按一下FN按键,再按INS即可切换为正常状态了

“一个字等于多少个字节?”是一个不严谨的问法

“一个字等于多少个字节?”是一个不严谨的问法 直接回答一个字等于多少个字节,也是不严谨的答法。 相关概念: 1、位(bit) 来自英文bit,音译为“比特”,表示二进制位。位是计算机内部数据储存的最小单位。…

parted分区命令行形式

一、pared分区实例 1、第一个主分区3G parted -s /dev/sdc mklabel gpt (标签为gpt,小于2t用msdos) parted -s /dev/sdc mkpart primary 0 3G 2、剩余空间给扩展分区 parted -s /dev/sdc mkpart entended 3 100% (从3G开始后面都做扩展分区)…

centos通过parted对2T以上硬盘分区并对根目录进行扩容

GPT的分区表很好了解决了传统MBR无法逾越2TB的限制。但是在Linux系统中,传统的fdisk命令无法支持gpt分区方式,这时候我们就要用到parted命令 需求: 将一个4t的硬盘(sdb)分为3个区,并将sdb1挂载在根目录下进行扩容 1…

Linux Command parted 创建分区

Linux Command parted 创建分区 tags: lvm 文章目录 Linux Command parted 创建分区1. 简介2. 交互模式2.1 常见命令2.2 查看分区表2.3 修改成 GPT 分区表2.4 建立分区2.5 建立文件系统2.6 调整分区大小2.7 删除分区 3. 命令行模式 1. 简介 虽然我们可以使用 fdisk命令对硬…

parted分区详解

---------- Linux中有两种常用的分区表MBR分区表(主引导记录分区表)和GPT分区表(GUID分区表),其中: MBR分区表:支持的最大分区时2TB,最多支持4个主分区,或3个主分区和1个拓展分区。 GPT分区表:支持最大18…

parted磁盘分区 教程

Linux parted磁盘分区实现步骤解析 相对于fdisk,parted用的比较少,主要用于大于2T的分区。 1.开始分区 help是查看帮助信息。 2.查看磁盘信息 可以看到当前磁盘没有分区,需要将分区表(Partition Table)类型更改为g…

【Windows环境下使用fvm管理多版本Flutter(flutter版本升级回退)】

Windows环境下使用fvm管理多版本Flutter(flutter版本升级回退) 安装FVM升级版本升级后,使用方法二再次安装fvm 安装FVM 方式一: 使用choco安装fvm(当时环境中Flutter版本是1.22.4,Dart是2.10.4&#xff0…

一个很好用的Flutter SDK版本管理神器fvm

前言 目前Flutter SDK正式版本已经更新到2.2.了,当升级了最新版运行之前的项目,其中最大的变化应该是要适配空安全了,这时如果项目又比较紧急暂不做适配,又只能降级Flutter版本了,然后新项目又要在最新Flutter版本去开…

在MacOS上不用FVM的Flutter多版本管理

网上看到都是用fvm进行多版本管理。 我用的方式没那么复杂,非常简单。 从下面url下载各版本的Flutter: https://flutter.dev/docs/development/tools/sdk/releases?tabmacos 按常规方式配置Flutter的环境。 将下载的Flutter包解压成文件夹后,都放到…

从FVM上线前的测试网统计报告中看前景,Filecoin将会迎来什么变化?

FEVM将在2023/03/14主网上线! 在Calibration网络升级正式完成后,Filecoin V18 Hygge升级将于2023年3月14日(π日)正式上线!此次升级将正式为Filecoin网络带来智能合约。基于FVM的可编程性。此次更新升级将释放数据经济…

fvm的管理多版本Flutter sdk

fvm简介 当多个项目使用不同的Flutter版本,或者Flutter发布新版本时,需要改变本地的Flutter版本,频繁的切换,非常消耗时间(upgrade),fvm的出现很好的解决多个版本来回切换的问题,并且对指定指定…

SecOc之Fvm新鲜度管理模块

Fvm新鲜度管理模块: 字段同步计数器(TirpCounter)重置计数器(ResetCounter)消息计数器(MessageCounter)重置低位(ResetFlag)描述MASTER FVM所在ECU会通过新鲜度值同步消息…

win下使用fvm实现多个Flutter版本的切换

win下使用fvm实现多个Flutter版本的切换 配置前说明:Win环境下,下载FVM时,需要先配置一个Dart环境,因为用到 dart pub命令 配置Dart环境 a. 方式一:可以去Dart官网下载安装 官网地址:https://gekorm.com/d…

FVM in CFD 学习笔记_第7章_OpenFOAM和uFVM中的有限体积网格

学习自F. Moukalled, L. Mangani, M. Darwish所著The Finite Volume Method in Computational Fluid Dynamics - An Advanced Introduction with OpenFOAM and Matlab Chapter 7 The Finite Volume Mesh in OpenFOAM and uFVM OpenFOAM是强大高效的开源代码,而uFVM…

fvm操作多个flutter的安装和使用教程

win下使用fvm实现多个Flutter版本的切换 配置前说明:Win环境下,下载FVM时,需要先配置一个Dart环境,因为用到 dart pub命令 1. 配置Dart环境 a. 方式一:可以去Dart官网下载安装 官网地址:https://…