Atitit.数据库表的物理存储结构原理与架构设计与实践
2. 数据表的物理存储结构 自然数序,与btree存储结构3
1. Oracle和DB2数据库的存储模型如图:
Oracle和DB2数据库的存储模型如图:
可以看出,数据库中的数据都存储在表空间中。表空间即是管理将逻辑数据库设计映射到操作系统物理存储中的一个数据库对象,用于指明数据的物理位置。关于表空间,以后再讨论。
Oracle数据库磁盘存储的逻辑结构为:一个数据库(Database)对应多个表空间(Tablespace),一个表空间对应多个段(Segment),一个段对应多个区(Extent),一个区对应多个数据块(Data Block),真正的数据就保存在数据块中
对应多个数据块(Data Block),真正的数据就保存在数据块中。这里有以下几点需要说明:
1.Oracle中一个数据块的大小默认是2KB(支持2KB,4KB,8KB,16KB,32KB),而DB2中则默认是4KB(支持4KB,8KB,16KB,32KB);
2.Oracle中有段(Segment)的概念,而DB2中没有这一概念,表空间直接是各个容器(数据文件)中的区(Extent)组成,不过也还是有一个很弱化的Extent组概念。下面提到的关于Segment的内容则全部是针对Oracle的;
3.Oracle中的数据块称为Oracle Block,而DB2中则直接称为Data Page(数据页)。
4.Oracle中的Extent称为区,而DB2中则称为扩展数据块。为方便阅读,本文中统称为区。
二、 段(segment)(这块儿没有详细记录)
段用于存储表空间中某一种特定的、具有独立存储结构的数据库对象的数据,它有一个或多个连续的区组成。当创建表、索引、簇等对象时,oracle就会为这些对象分配存储空间(即段),以便存储它们的数据。按照段中所存储的数据的特征、用途不同,可以分为以下几种:
段类型 |
名称 |
段类型 |
名称 |
Index partition |
索引分区段 |
Deferred rollback |
延迟回退段 |
Table partition |
表分区段 |
Undo |
撤销段(还原段) |
Table |
表段(数据段) |
Temporary |
临时段 |
Cluster |
簇段 |
Cache |
高速缓存段 |
Index |
索引段 |
Lob |
二进制大对象段 |
Rollback |
回退段 |
Lobindex |
二进制大对象索引段 |
1.1. 2. 表数据在块中的存储以及RowId信息
表的字段除了设计者设计的字段外,还有个伪列Rowid;RowId是oracle每个表记录的位置信息。当表中插入一行记录时,此记录的块就有一个唯一的物理位置,这个位置信息在查询记录时显示为RowId伪列;
作者:: 绰号:老哇的爪子 ( 全名::Attilax akbar al rapanui 阿提拉克斯 阿克巴 阿尔 拉帕努伊 ) 汉字名:艾龙, EMAIL:1466519819@qq.com
2. 数据表的物理存储结构 自然数序,与btree存储结构
3. 索引
2.1. 普通表中记录的存储顺序随机顺序存储
,在一个数据量很大的表中,如果不引入其他的手段,每次查找小部分记录都是从第一条扫描到最后一条,这样,系统将慢得不能使用;使用索引可以有效解决问题;
索引的本质用途是通过它使读取进程在扫描源表时的数据块范围大大减小了,因此性能大幅度提高;
三、索引
2.2. 数据库以B树格式储存,
只解决了按照”主键”查找数据的问题。如果想查找其他字段,就需要建立索引(index)。
所谓索引,就是以某个字段为关键字的B树文件。假定有一张”雇员表”,包含了员工号(主键)和姓名两个字段。可以对姓名建立索引文件,该文件以B树格式对姓名进行储存,每个姓名后面是其在数据库中的位置(即第几条记录)。查找姓名的时候,先从索引中找到对应第几条记录,然后再从表格中读取。
这种索引查找方法,叫做“索引顺序存取方法”(Indexed Sequential Access Method),缩写为ISAM。它已经有多种实现(比如C-ISAM库和D-ISAM库),只要使用这些代码库,就能自己写一个最简单的数据库。
问题,数据到底是按照先来后到存储,还是按照主键的btree。。按道理是无规律,否则没增加一个字段都要重新排序文件??Yeyou可能prikey自增,会自动排在后面》》??
3. 分区
4. 行记录的物理结构 以及 RowId
RowId可以用hash记录得到
D:\workspace 空格\AtiPlatf\info_schema\columns\shopedb\底单申请表
每一个文件就是一个记录。。一下是此文本json格式的记录
{
"TABLE_NAME": "CHARACTER_SETS",
"CHARACTER_OCTET_LENGTH": 96,
"TABLE_CATALOG": "def",
"COLUMN_COMMENT": "",
"COLUMN_DEFAULT": "",
"IS_NULLABLE": "NO",
"COLUMN_TYPE": "varchar(32)",
"COLLATION_NAME": "utf8_general_ci",
"CHARACTER_SET_NAME": "utf8",
"CHARACTER_MAXIMUM_LENGTH": 32,
"TABLE_SCHEMA": "information_schema",
"COLUMN_NAME": "img_col",
"EXTRA": "",
"ORDINAL_POSITION": 2,
"NUMERIC_PRECISION": null,
"PRIVILEGES": "select",
"NUMERIC_SCALE": null,
"COLUMN_KEY": "",
"DATA_TYPE": "img"
}
5. Oracle中具有如下几类数据结构:
数据文件:存放数据库中的数据。表和索引是数据库用来存储数据的逻辑结构,数据文件即用来存放表和索引数据。
日志文件:存放数据库操作日志的文件。整个数据库的运行过程被日志化,日志集中存放在日志文件中,用于数据库系统的数据恢复操作。
控制文件:存放数据库物理结构和运行状态信息的文件,存储了数据库名、数据文件和日志文件名、数据库日志归档状态和系统备份状态等信息。
Oracle数据库由下列逻辑结构组成:
系统表空间,用来集中存储Oracle的系统数据。
临时表空间,用于数据库事务处理过程中的临时数据处理。
用户表空间,用于存储用户的数据库对象和最终数据。
还原表空间(回滚表空间),用于存储事务操作过程的数据前映像,以应对用户可能的回退操作。
三、 区(extent)
区是由物理上连续存放的块所组成的。区 是oracle存储分配的最小单位。一个或多个块组成区,一个或多个区组成段。一个区只能属于一个数据文件。
当在数据库中创建带有实际存储结构的方案对象时(如表、索引),oracle将为方案对象分配若干个区(视该方案的初始大小而定),以便组成一个对应的段,来为该方案对象提供初始的存储空间。当段中已分配的区都写满,oracle就要在该方案对象所在的表空间中为该段分配下一个新的空白区,以便容纳更多的数据。
四、 块(block)
块是最小的数据管理单位,即oracle的所有存储的i/o操作都是以块为单位的。相对应的,操作系统执行i/o操作的最小单位是操作系统块。块得大小是操作系统块得大小的整数倍。
块得大小是一个表空间的属性。SYSTEM和SYSAUX表空间具有相同的、标准的块大小,这个大小是在创建数据库时(会同时创建这两个表空间)由DB_BLOCK_SIZE初始化参数指定的,但在创建数据库之后这个参数值不能改变。
一、 控制文件
控制文件是一个很小的(通常是数据库中最小的)文件,大小一般在1~5M左右,为二进制文件。但它是数据库中的关键性文件,它对数据库的成功启动和正常运行都是至关重要的,因为它存储了在其他地方无法获得的关键信息,这些信息包括:
1、数据库的名称
2、数据文件和重做日志文件的名称、位置、联机\脱机状态和大小
3、发生磁盘故障或用户错误时,用于恢复数据库的信息(日志序列号,检查点)
在数据库的运行过程中,每当出现数据库检查点或修改数据库的结构之后,oracle(只能有oracle本身)就会修改控制文件的内容。DBA可以通过OEM工具修改控制文件中的部分内容,但DBA和用户都不应该认为的修改控制文件中的内容,否则会破坏控制文件。
三、 重做日志文件
当用户对数据库进行修改的时候,实际上是先修改内存中的数据,过一段时间后,再集中将被村中的修改结果成批的写入到上面的数据文件中。oracle采取这样的做法,主要是出于性能上的考虑,因为针对数据操作而言,内存的速度比硬盘的速度要快成千上万倍。
oracle利用“(联机)重做日志文件”随时保存修改结果,即oracle随时将内存中的修改结果保存到“重做日志文件”中。“随时”表示在将修改结果写入到数据文件之前,可能已经分几次写入到“重做日志文件”。因此,即使发生故障导致数据库崩溃,oracle也可以利用重做日志文件中的信息来恢复丢失的数据。只要某项操作的重做信息没有丢失,就可以利用这些重做信息来重现该操作。
oracle是以循环方式来使用重做日志文件的,所以每个数据库至少需要两个重做日志文件。当第一个重做日志文件被写满后,后台进程LGWR(日志写进程)开始写入第二个重做日志文件;当第二个重做日志文件被写满后,又始写入第二个重做日志文件,以此类推。
6. 参考
自己实现一个最简单的数据库_电脑教程学习网.htm
数据库的最简单实现 - 阮一峰的网络日志.htm
Atitit.数据库表的物理存储结构原理与架构设计与实践的更多相关文章
-
Mysql-Innodb : 从一个字节到整个数据库表了解物理存储结构和逻辑存储结构
首先要从Innodb怎么看待磁盘物理空间说起 一块原生的(Raw)物理磁盘,可以把他看成一个字节一个字节单元组成的物理存储介质 如果要在这块原生物理空间中插入一条记录,不能单单只插入数据,还需 ...
-
InnoDB的表类型,逻辑存储结构,物理存储结构
表类型 对比Oracle支持的各种表类型,InnoDB存储引擎表更像是Oracle中的索引组织表(index organized table).在InnoDB存储引擎表中,每张表都有个主键,如果在创建 ...
-
Oracle 11g 物理存储结构
Oracle 系统的物理存储结构比较具体和直观,它用来描述 Oracle 数据在磁盘上的物理组成情况.Oracle 系统的数据在逻辑上存储在表空间中,而在物理上存储在表空间所包含的物理文件(即数据文件 ...
-
学习笔记:oracle学习一:oracle11g体系结构之物理存储结构
目录 1.物理存储结构 1.1 数据文件 1.2 控制文件 1.3 日志文件 1.3.1 重做日志文件 1.3.2 归档日志文件 1.4 服务器参数文件 1.4.1 查看服务器参数 1.4.2 修改服 ...
-
(1.3)学习笔记之mysql体系结构(C/S整体架构、内存结构、物理存储结构、逻辑结构)
目录 1.学习笔记之mysql体系结构(C/S架构) 2.mysql整体架构 3.存储引擎 4.sql语句处理--SQL层(内存层) 5.服务器内存结构 6.mysql如何使用磁盘空间 7.mysql ...
-
14.8.3 Physical Row Structure of InnoDB Tables InnoDB 表的物理行结构
14.8.3 Physical Row Structure of InnoDB Tables InnoDB 表的物理行结构 一个InnoDB 表的物理行结构取决于在创建表指定的行格式 默认, Inno ...
-
Atitit 数据库表文档生成解决方案
Atitit 数据库表文档生成解决方案 1.1. Sql dml文件结构法 最快速1 1.2. Sql法+sp存储过程 (表格式样)1 1.3. Navicate uml法 (uml格式)2 1.4. ...
-
Prometheus时序数据库-内存中的存储结构
Prometheus时序数据库-内存中的存储结构 前言 笔者最近担起了公司监控的重任,而当前监控最流行的数据库即是Prometheus.按照笔者打破砂锅问到底的精神,自然要把这个开源组件源码搞明白才行 ...
-
Prometheus时序数据库-磁盘中的存储结构
Prometheus时序数据库-磁盘中的存储结构 前言 之前的文章里,笔者详细描述了监控数据在Prometheus内存中的结构.而其在磁盘中的存储结构,也是非常有意思的,关于这部分内容,将在本篇文章进 ...
随机推荐
-
SVN源代码泄露
1. 联想b2b站SVN源代码泄露 开启Firefox,输入:b2b.thinkworldshop.com.cn/.svn/entries Webserver返回如下信息:
-
JComboBox
package swing.combox; import java.awt.FlowLayout; import javax.swing.DefaultComboBoxModel; import ja ...
-
[转载]lib和dll文件的区别和联系
出处:https://blog.csdn.net/weiaipan1314/article/details/52252478 什么是lib文件,lib和dll的关系如何 (2008-04-18 19: ...
-
Java流程控制语句
流程控制语句 内容: if... if...else if...else if...else switch...case for while do...while 分支结构if 接下来要学习的if条件 ...
-
微信小游戏 4M升8M分包加载
一.微信分包加载 微信分包加载教程 嘛,因为原来的4M太小了,满足不了小游戏内容的需求,现在提升到了8M.这8M可以分包加载,而不需要一次性加载8M. 如果是老版本,则分包加载不起作用,会一次加载8M ...
-
centos7,php7 安装mysqli扩展
首先安装MySQL https://www.cnblogs.com/manzb/p/9560403.html php7安装后没有安装mysqli扩展的话: 安装mysqli扩展 1.到php文件e ...
-
【Vue实战之路】一、Vue-cli入门及Vue工程目录全解。
全面的Vue-cli学习,这一篇就够了! 一.下载 使用vue-cli前,需先安装node.js,node的安装就不赘述,不过在此需要注意: 1. node版本需在4.x以上,首推6.x以上版本(no ...
-
libev ev_init分析
/* these may evaluate ev multiple times, and the other arguments at most once */ /* either use ev_in ...
-
关于TP5中的依赖注入和容器和facade
看了不少的文章,也看了官方的介绍,还是根据自己的理解,写写看法,理清下思路 只是单纯的说依赖注入Dependency Injection和容器 别的不白扯 比如有A,B,C三个类 A类的1方法依赖B类 ...
-
Hdfs&;MapReduce测试
Hdfs&MapReduce测试 测试 上传文件到hdfs 随意打开一个文件夹传一个文件试试(把javafx-src.zip传到hdfs的/根目录下):hadoop fs -put javaf ...