存储与索引(陈志华)

合集下载

在文件的索引节点中存放直接索引指针10个, 一级和二级索引指针各1个。磁盘块大小

在文件的索引节点中存放直接索引指针10个, 一级和二级索引指针各1个。磁盘块大小

在文件的索引节点中存放直接索引指针10个, 一级和二级索引指针各1个。

磁盘块大小
答:当我们谈论文件的索引节点时,我们通常是在讨论UNIX或Linux文件系统中的inode。

一个inode包含了关于一个文件或目录的信息,包括其数据块的位置。

对于直接索引,文件的数据块直接存储在inode中。

由于有10个直接索引指针,那么意味着文件最多可以有10个直接数据块。

对于一级间接索引,文件的数据块存储在另一个inode中,而这个inode再指向数据块。

对于二级间接索引,数据块的位置存储在两个中间的inode中。

但我们还需要知道的是,每个数据块的大小。

这个信息在你给出的描述中没有给出。

不过,我们可以推断:
1. 一个直接数据块的大小是固定的,由文件系统决定。

2. 一级间接索引的inode的大小也是固定的,但指向的数据块的大小与直接数据块的大小相同。

3. 二级间接索引的inode的大小也是固定的,但指向的inode(即一级间接索引的inode)的大小与直接数据块的大小相同,而最终指向的数据块的大小也与直接数据块的大小相同。

要确定文件系统中的数据块大小和inode大小,我们需要具体查看该文件系统的文档或规格。

在大多数现代UNIX和Linux文件系统中,通常默认的数据块大小是1KB(尽管它可以在创建文件系统时指定)。

但是,最好查看具体的文件系统规格或文档来获得确切的信息。

tdengine索引结构

tdengine索引结构

tdengine索引结构TDengine索引结构是TDengine数据库中的核心组成部分,它对于数据库的查询性能和数据存储效率起着至关重要的作用。

本文将从索引的定义、分类和应用方面,以及TDengine索引结构的设计和优化等多个方面进行详细介绍。

一、索引的定义、分类和应用1. 定义:索引是一种用于提高数据库查询性能的数据结构,它可以加快数据的检索速度,并且可以对数据进行快速排序和组织。

索引通常是根据某一列或多列的数据创建的,通过建立索引,可以加快对于这些列数据的查询速度,提高数据库的性能。

2. 分类:根据索引的数据结构和实现方式,索引可以分为多种类型。

常见的索引类型包括B树索引、哈希索引、全文索引等。

不同的索引类型在不同的场景下具有不同的优势和适用性。

3. 应用:索引广泛应用于数据库的查询操作中,通过在查询字段上创建索引,数据库系统可以快速定位到符合查询条件的数据,从而提高查询的效率。

索引还可以用于保证数据的唯一性(唯一索引)、加速数据的排序(排序索引)等操作。

二、TDengine索引结构的设计和优化1. 索引结构的设计:TDengine数据库采用的是B树索引结构。

B树是一种多叉树,它具有平衡性和高度可扩展性的特点,适用于大规模数据的存储和检索。

在TDengine中,B树索引被用于加速列数据的查询和排序。

2. 索引的存储和查找:在TDengine中,索引以B树的形式存储在内存中,通过B树的查找算法可以快速定位到符合查询条件的数据。

当数据库数据量过大,无法完全放入内存时,TDengine还会将索引持久化到磁盘上,以保证数据的可靠性和持久性。

3. 索引的优化策略:为了进一步提高查询性能和存储效率,TDengine采用了多种索引优化策略。

其中包括使用前缀压缩技术减小索引的存储空间,通过压缩算法减少磁盘IO,提高索引的访问速度等。

此外,TDengine还支持跳表等数据结构,用于加速索引的查找过程。

三、TDengine索引结构的应用场景1. 时间序列数据的查询:TDengine主要用于处理时间序列数据,如传感器数据、监控数据等。

索引的类型分类、区别、优缺点

索引的类型分类、区别、优缺点

索引的类型分类、区别、优缺点导读:索引是在存储引擎中实现的,也就是说不同的存储引擎,会使⽤不同的索引。

MyISAM和InnoDB存储引擎:只⽀持BTREE索引,也就是说默认使⽤BTREE,不能够更换。

MEMORY/HEAP存储引擎:⽀持HASH和BTREE索引。

mysql的索引我们分为三⼤类来讲单列索引(普通索引,唯⼀索引,主键索引)、组合索引、全⽂索引。

⼀、单列索引:⼀个索引只包含单个列,但⼀个表中可以有多个单列索引。

这⾥不要搞混淆了1:普通索引:MySQL中基本索引类型,没有什么限制,允许在定义索引的列中插⼊重复值和空值,纯粹为了查询数据更快⼀点。

2:唯⼀索引:索引列中的值必须是唯⼀的,但是允许为空值。

3:主键索引:是⼀种特殊的唯⼀索引,不允许有空值。

(主键约束,就是⼀个主键索引)。

主键索引与唯⼀索引的区别:1. 主键是⼀种约束,唯⼀索引是⼀种索引,两者在本质上是不同的。

2. 主键创建后⼀定包含⼀个唯⼀性索引,唯⼀性索引并不⼀定就是主键。

3. 唯⼀性索引列允许空值,⽽主键列不允许为空值。

4. 主键索引在创建时,已经默认为⾮空值+ 唯⼀索引了。

5. ⼀个表最多只能创建⼀个主键索引,但可以创建多个唯⼀索引。

6. 主键更适合那些不容易更改的唯⼀标识,如⾃动递增列、⾝份证号等。

7. 主键可以被其他表引⽤为外键,⽽唯⼀索引不能。

⼆、组合索引:在表中的多个字段组合上创建的索引,只有在查询条件中使⽤了这些字段的左边字段时,索引才会被使⽤,使⽤组合索引时遵循最左前缀集合。

例如,这⾥由id、name和age3个字段构成的索引,索引⾏中就按id/name/age的顺序存放,索引可以索引下⾯字段组合(id,name,age)、(id,name)或者(id)。

如果要查询的字段不构成索引最左⾯的前缀,那么就不会是⽤索引,⽐如,age或者(name,age)组合就不会使⽤索引查询。

三、全⽂索引:全⽂索引,只有在MyISAM引擎上才能使⽤,只能在CHAR,VARCHAR,TEXT类型字段上使⽤全⽂索引,介绍了要求,说说什么是全⽂索引,就是在⼀堆⽂字中,通过其中的某个关键字等,就能找到该字段所属的记录⾏,⽐如有"你是个⼤煞笔,⼆货 ..." 通过⼤煞笔,可能就可以找到该条记录。

清华大学数据库access课件-第08章:索引和散列资料

清华大学数据库access课件-第08章:索引和散列资料

引项)的文件。
■基本概念
■散列文件组织 ■SQL中索引的定义
■顺序索引
■散列索引
■多码访问
■B+树索引文件 ■两种索引的比较■本章总结
§8.1基本概念
➢基本索引
✓ 顺序索引:
• 基于对值的一种排序; • 结构:顺序文件和B树文件
✓ 散列索引:
• 基于将值平均、随机地分布到若干存储桶中:
由1至32个连续的物理块构成的一种存储结构; 与物理块不同的是,存储桶只能包含整记录,即记 录可以跨块存储但不能跨桶存储。
✓ 堆文件与索引顺序文件
• 没有主索引的数据文件就是堆文件; • 而拥有主索引的数据文件就是索引顺序文件。
§8.2顺序索引
➢索引顺序文件
✓ 数据文件中的记录按照某个搜索码值的顺序 物理存储:
§8.2顺序索引
➢顺序索引的分类
✓ 按照索引结构中搜索码值与数据文件中搜索 码值的对应关系,顺序索引又分为:
•稠密索引 •稀疏索引
✓ 稠密索引:
•对应文件中搜 索码的每一个 值都有一个索 引记录(或索引项),它包括:
搜索码值; 指向具有该搜索码值的第一个数据记录的指针。
§8.2顺序索引
➢顺序索引的分类
✓ 稀疏索引:
• 只为搜索码的部分值建立索引项; • 与稠密索引一样,每个索引项也包括搜索码值和
指向具有该搜索码值的第一个数据记录的指针。
96 216 136 176
3210
页头: 96字节
数据行,即记录
RID是01:010:01 的记录的搜索码 是Downtown
行偏移数组:链表 各行顺序号(槽号)
§8.2顺序索引
➢稠密索引和稀疏索引的比较
✓ 利用稠密索引通常可以比稀疏索引更快地定 位一个记录的位置;

oracle的索引类型

oracle的索引类型

oracle的索引类型
Oracle数据库中常见的索引类型包括:1. B树索引(B-tree Index):是Oracle 默认的索引类型,适用于等值查找和范围查找。

2. 唯一索引(Unique Index):确保索引列的值在表中是唯一的。

3. 聚集索引(Cluster Index):按照表的物理存储顺序进行索引,适用于频繁进行范围查找的列。

4. 位图索引(Bitmap Index):将索引列的不同值分组为位图,并对每个位图使用压缩算法,适用于低基数列(取值范围较小)。

5. 函数索引(Function-Based Index):基于表达式或函数的结果构建的索引,适用于计算、转换或覆盖列的查询。

6. 虚拟列索引(Virtual Column Index):基于虚拟列(由表达式计算而来)构建的索引。

7. 全文索引(Full-Text Index):适用于对文本数据进行全文搜索的场景。

8. 空间索引(Spatial Index):适用于对地理位置和空间数据进行查询和分析。

9. 哈希索引(Hash Index):根据哈希函数计算的值来构建索引,适用于等值查询的索引。

10. 反向索引(Reverse Key Index):逆序存储索引键的位模式,适合于高度并发且插入操作有序的情况。

需要根据具体业务和查询需求选择合适的索引类型,以提高查询性能。

数据结构--第11章 文件

数据结构--第11章 文件
• 存储在顺序存储器(如磁带)上的文件,只能 是顺序文件,这种文件只能进行“顺序存取” 和“成批处理”。 • 顺序存取是指按记录的逻辑(或物理)顺序实现 逐个存取, • 若要查询第i个记录则必须先检索前 i-1 个记 录; • 插入新的记录只能加在文件的末尾;
• 更新某个记录必须对整个文件进行"复制"。
• 每个记录面有一个读/写磁 头,所有读写头安装在一 个活动臂装置上,可以一 起作径向移动。当磁道在 读/写头下通过时,便可以 进行信息的读/写。
• 各记录盘面上直径相同 的磁道组成一个“柱面”
• 一个磁道又可分为若干 弧段,称为“扇面”。 • 磁盘信息存取的单位为 一个扇面的字符组,称 为一个“页块” • 因此需用一个三维地址 来表明磁盘信息:柱面 号、记录面号和页块号。
二、B树的操作
• (1)按关键码进行查找 假设要查找关键码等于 kval 的记录
• 首先将根结点读入内存进行查找,若找到,即找 到了该记录所对应的物理记录位置,算法结束;
• 否则沿着指针所指,读入相应子树根结点继续进 行查找,直至找到关键码等于kval的索引项或者 顺指针找到某个叶子结点
• 前者可由索引项取得主文件中的记录,后者说明 索引文件中不存在关键码等于 kval 的记录。
二、磁盘存储器
• 磁盘是一种直接存取的存 储设备,既能顺序存取, 又能随机存取。目前使用 多为活动头磁盘。
• 由若干盘片组成一个盘片 组,固定在一个主轴上, 随着主轴顺一个方向高速 旋转。
• 除最顶上和最底下的两个 外侧盘面外,其余用于存 储数据的盘面称为“记录 盘面”,简称“记录面” • 记录面上存储数据的同心 圆称为“磁道”。
• 静态索引以ISAM文件为代表,它是一种专为磁 盘存取设计的文件组织方式,由索引区,数据区 和溢出区三部分组成。 • 索引区通常是与硬件层次一致的三级索引:总索 引,柱面索引和磁道索引,溢出区用来存放后插 入的记录。

indexdb存储的方法

indexdb存储的方法

indexdb存储的方法
IndexDB是一种浏览器端的数据库,它允许网页脚本在浏览器
中存储和检索数据。

IndexDB存储数据的方法主要包括以下几个方面:
1. 打开数据库,使用IndexedDB API中的open方法来打开一
个数据库。

如果数据库不存在,则会创建一个新的数据库。

2. 创建对象存储空间,一旦数据库打开,就可以使用createObjectStore方法来创建一个新的对象存储空间(类似于表),用于存储数据。

3. 存储数据,通过调用事务对象的add或put方法,可以将数
据存储到对象存储空间中。

add方法用于向对象存储空间添加新的
数据,如果该数据已存在,则会抛出一个错误;而put方法则用于
向对象存储空间添加新数据,如果数据已存在,则会更新该数据。

4. 读取数据,使用事务对象的get或getAll方法可以从对象
存储空间中读取数据。

get方法用于根据指定的键检索单个数据项,而getAll方法则用于检索对象存储空间中的所有数据项。

5. 更新数据,通过put方法可以更新对象存储空间中的数据。

6. 删除数据,使用delete方法可以从对象存储空间中删除指定的数据项。

7. 索引,可以使用createIndex方法在对象存储空间中创建一个索引,以便更高效地检索数据。

总的来说,IndexDB存储数据的方法主要涉及打开数据库、创建对象存储空间、存储数据、读取数据、更新数据、删除数据以及创建索引等操作。

这些方法可以通过IndexedDB API来实现,在使用过程中需要注意事务的管理以及错误处理等问题。

希望这些信息能够帮助到你。

数据库常见的存取方法

数据库常见的存取方法

数据库常见的存取方法一、索引方法。

索引就像是一本书的目录呢。

它能让数据库快速定位到想要的数据。

比如说,你有一个超级大的数据库,里面存了好多好多用户的信息。

如果没有索引,要找一个特定用户的信息,就可能得把整个数据库翻个遍,那可太耗时啦。

但是有了索引,就像在目录里一下子找到对应的页码一样,能迅速找到数据所在的位置。

像B - 树索引,它就像一棵很有结构的大树,每个节点都存储着一定的信息,能够高效地引导我们找到数据。

二、哈希方法。

哈希方法就很有趣啦。

它就像给每个数据都打了一个独特的标签。

把数据通过一个特定的哈希函数计算一下,就得到一个哈希值,这个值就对应着数据存储的位置。

这就好比每个人都有一个独一无二的身份证号,通过身份证号就能快速找到这个人的相关信息。

不过呢,哈希方法也有小缺点,如果有很多数据经过哈希函数得到了相同的哈希值,这就叫哈希冲突,就像好多人不小心有了相同的身份证号(当然现实中不会啦,只是打个比方),这时候就需要一些特殊的处理方法来解决这个冲突。

三、聚簇存取方法。

这个方法呀,有点像把相关的数据都放在一起住呢。

比如说,一个公司的员工信息,把同一个部门的员工信息都紧紧挨在一起存储。

这样做的好处是,当你要查询一个部门的所有员工信息时,就不需要东找一个西找一个啦,直接在一块地方就能把这些相关的数据都拿到手,效率那是杠杠的。

数据库的这些存取方法都各有千秋呢。

它们就像是一群小伙伴,在数据库这个大舞台上各自发挥着自己的作用,让数据的存储和获取变得又快又准。

不管是简单的小数据库,还是超级复杂的大型数据库,都离不开这些存取方法的帮忙。

宝子,你现在是不是对数据库存取方法有点感觉啦 。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

可扩展哈希法的基本方法
可扩展哈希法的基本技术是使用哈希函数h得到二进制数,然后解释后d 位数作为目录的偏移量,这里d依赖于目录的大小。上述示例中,d最初是2, 因为只有4个桶。分裂后,d变为3,因此现在有8个桶。当项在原桶和它分 裂映像桶间重分布时,应该在第d位的基础上进行。数字d被称为全局深度 (GLOBAL DEPTN),并作为文件头的一部分保存起来,在每次需要定位 数据项时,都要使用它。 为了确定目录是否需要加倍,需要为每一个桶维护一个局部深度(LOCAL DEPTN)。如果一个桶的局部深度等于全局深度,且需要分裂时,目录必 须加倍。如图(c)索引中插入9*时,它属于局部深度为2的B桶,而全局深 度为3。尽管桶被分裂但目录不必分裂。另一方面A桶和A2桶的局部深度等 于全局深度,如果他们被填满,有需要分裂,目录就必须分裂。
此图展示的是关 系型DBMS的缓 冲区管理策略, 即: 缓冲区管理器直 接控制主存,相 应内存访问磁盘 块的请求。
缓冲区管理结构-缓冲池
高层代码的页请求 正在访问的Frame
Dirty Frame
Free Frame 已访问完且未被 修改的数据
如果所需的页不再Buffer Pool中且Buffer Pool已满 则用替换策略进行调度
4
缓冲区管理结构
• 两种主要的缓冲区管理结构 1、缓冲区管理器直接控制主存。这种管理结构在大多数关 系型DBMS中使用。
2、缓冲区管理器在虚拟内存中分配缓冲区,并由操作系统 干预缓冲区分配。这种管理结构在大多数“主存”DBMS和 面向对象的DBMS中使用。
5
缓冲区管理策略
读 /写 请求 缓冲区
缓冲区 管理器
组织数据项方法之一是按照搜索码对数据进行哈希。另一种方法是建立 一个树状的数据结构,将搜索定位到数据项
8.3索引数据结构
如上图所示,左边表示的是树结构索引的一个实例,右边表示的是哈 希索引的一个实例。
8.3.1 基于哈希的索引
Hash:译“散列”,也译“哈希”,一种将任意长度的输入压缩到某
一固定长度的输出的方法;
Introduction of storage and index (存储与索引概述)
目录
1
外部存储上的数据 文件组织与索引 索引数据结构 基于哈希的索引 树结构索引
2
3 4 5
8.1 外部存储上的数据
DBMS存储了大量的数据,并且数据要在程序执行过程中保持持久性。 因此数据要存储在诸如磁盘和磁带的外部存储设备上,并在需要处理时 载入内存。磁盘上读写信息的单位是夜,页的大小是DBMS的一个参数, 典型的值是4KB或8KB。 页I/O(从磁盘输入到主存及主存输入到磁盘)的代价代表了典型的 数据库操作的代价,因此需要小心的优化数据库系统尽量减小这个代价。 下面介绍存储设备的一些特性: 1 磁盘是最重要的外存设备。按照页面存储的物理顺序连续读取若干页, 所花的代价更小。 2 磁带是顺序访问设备,我们必须一页一页地读。通常用于不常用数据 存储。 3文件中的每一记录都有一个唯一的标示符,称为记录id,简称rid。一 个rid有一个属性,可以用它来表示包含该记录的页在磁盘上的地址。 为了处理,数据需要读入内存;为了持久存储,数据需要写入磁盘。 这些操作都是由称为缓冲区管理器的软件来完成的。这就涉及到缓冲区 的概念了!
可扩展哈希--实例
• 目录由4个元素的数值组成,每个 元素都是一个指向桶的指针。 • 要定位一个数据项,首先在查找 键上应用哈希函数,然后从它的 二进制表达中取后两位得到一个0 到3之间的数,根据这个数在目录 位置上的指针指向期望的桶。 – 定位哈希值为5(二进制101) 的数据项,查找目录元素01, 然后沿着指针找到数据页(桶 B)。
可扩展hash表简介:它在静态hash结构中主要增加如下: 引入了一个间接层(目录),它包含一个指向桶的指针数组,每一个 指针指向一个桶; 指针数组可以增长,它的长度总是2的倍数; Hash函数h为每个键计算出一个K位二进制序列,该K值足够大,无论 何时桶的数目都是使用从序列末尾开始的若干位。
静态hash的插入与删除
为了插入一个数据项,需要使用哈希函数首先确定正确的桶,然后把 项放入桶中。如果该桶没有足够的空间存放该数据项,则需分配一个 新的溢出项,把项放在溢出页上,再把溢出页加到该桶的溢出链上。 为了删除一个数据项,需要使用哈希函数首先确定正确的桶,然后搜 索桶,找到数据项,并删除它。如果这个数据项是一个溢出页的唯一 一项数据,则该溢出页将从桶的溢出链中移出,并加入到空闲页列表 中。
可扩展哈希--插入
• 插入 • 定位桶,如果桶未满,直接插入; • 如果桶满,则需要分裂(分配新的 页,重分布)。如有必要,需加倍 目录。
插入h(r)=20的目录
插入h(r)=20前(a)
插入h(r)=20时(b)
Байду номын сангаас
插入h(r)=20后(c)
要插入数据项20,首先查询目录元素00,并沿着它到达桶A,刚好桶A是满 的。于是通过分配一个新桶而分裂桶A,然后在原来的桶和它的分裂印象之 间重新分部内容。为了重新分布项,需要考虑h(r)的最后三位。后两位是 00,说明该项属于上述两个桶之一,第三位(从尾部算起)则用于区别这 两个桶。如,指向桶A目录元素第三位为0,而指向桶A2目录元素第三位为 1。此时目录不够用,应该加倍,只有第三位不同的元素被称为是“对应” 的。
记录文件是DBMS中的一个重要抽象,并且被文件及访问方法层的代码
数据项的三种不同的表达方式:
(1)数据项k*是一个真正的数据记录。 (2)数据项是一个<k,rid>对,其中rid是搜索码值为k的数据记录的记录id。 (3)数据项是一个<k,rid-list>对,其中rid-list是搜索码值为k的数据记录的 记录id的列表。 第一种方式,每个项k*就是一个搜索码值为k的数据记录。第二和第三方式包 含指向数据记录的数据项,并独立于被索引文件的文件组织与第二种方式相比, 第三种方式更好地利用了空间,但是其数据项是变长的,其长度依赖于给定搜 索码值对应的数据记录。 如果想在一个数据记录的集合上建立多个索引,至少一个索引应该采取第一 种方式,这是为了避免多次存储数据记录的情况发生。
缓冲区概述
• 缓冲区:主存储器中用于存储磁盘块的拷贝的部分,由固定数目的缓 冲块构成。 • 缓冲区设置目的:减少磁盘和主存储器之间传输的块的数目。提高数 据传输效率。 • 缓冲区管理器:负责缓冲区空间分配的子系统。 • 缓冲区管理器软件层:在必要时把页面从磁盘取到主存的软件层。 一些概念: 缓冲池(Buffer Pool): 即页集,通过把缓冲区划分为不同的缓冲池 来进行管理。 帧(frame):缓冲池中的每页。 页:磁盘上读写信息的基本单位,大小相等的片。经典的页大小值是 4KB或8KB。
不过这个定义太抽象了。在SQL Server中,索引是通过二叉树的数 据结构来描述的,我们可以这么理解聚簇索引:索引的叶节点就是数据 节点。而非聚簇索引的叶节点仍然是索引节点,只不过有一个指针指向 对应的数据块。如下图:
如上图所示,索引的搜索码指向的是一个节点,该节点指向叶节点,而叶 节点存储的数据项指向了数据记录的具体位置,但是这些数据项是无序的, 他们的顺序与数据记录的顺序没有关系。
静态哈希的优缺点
理想情况下查询只需要一次磁盘I/O,且文件的插入和删除操作也 只需要两次I/O(读和写)。 静态哈希的桶数固定。如果一个文件缩减太大,会浪费很多空间; 如果文件增长很大,将产生较长的溢出链,导致性能下降。 可扩展哈希可解决这一问题
8.3.1.2可扩展哈希
为了理解可扩展的哈希方法,首先考虑静态哈希文件。如果现在需要 向一个满的桶中插入一个新的数据项,如果不想增加溢出页,而重新组 织文件,把桶数加倍,并且桶集合中重新分配项,很麻烦。一个简单的 方法是:使用一个指向桶的指针目录,同时仅仅通过目录加倍和分裂溢 出桶来实现桶数的加倍。
8.2.1 聚簇索引和非聚簇索引
聚簇索引的解释是:聚簇索引的顺序就是数据的物理存储顺序,而对非 聚簇索引的解释是:索引顺序与数据物理排列顺序无关。正式因为如此, 所以一个表最多只能有一个聚簇索引。由定义可知,使用第一种方式的 索引是聚簇索引。使用第二种和第三种方式的索引只有数据记录按照搜 索码排序时才是聚簇索引,否则数据记录是任意排列的,仅仅有它们的 物理顺序排列,那么将索引的数据项按照数据记录的顺序排列是没有意 义的。
4.系统控制
8.2 文件组织与索引
实现。文件可以被创建、删除以及向其中插入或删除记录。一个关系通 常存储为一个记录文件。文件层将文件中的记录存储于一组磁盘页,并 且跟踪分配给每一个文件的所有页以及页的可用空间。 最简单的文件结构是无序文件,或称堆文件。一个堆文件中的数据 在文件页中以任意的顺序排列。堆文件组织支持所有记录的检索或者检 索指定rid的某一特定记录。 索引是在磁盘上组织数据记录的一种数据结构,它用于优化某数据 检索的操作。索引使得我们能够有效地检索满足索引的搜索码字段上的 搜索条件的那些记录。可以在一个给定的数据记录集合上创建多个索引, 每一个索引,都有不同的搜索码,以支持那些不能被文件组织有效支持 的搜索操作。 我们使用术语数据项来指代存储在索引文件的记录。搜索码值为k的 数据项记为k*,包含有足够的信息以定位搜索码值为k的数据记录。我 们可以有效地搜索一个索引来找到想要的数据项,然后使用这些数据项 来获得数据记录。
如上图所示,索引的叶节点存储的数据项指向数据记录,数据项的顺 序与数据记录的顺序相同。
索引块与数据块的区别
大家都知道,索引可以提高检索效率,因为它的二叉树结构以及占用空 间小,所以访问速度块。让我们来算一道数学题:如果表中的一条记录 在磁盘上占用1000字节的话,我们对其中10字节的一个字段建立索引, 那么该记录对应的索引块的大小只有10字节。我们知道,SQL Server 的最小空间分配单元是“页(Page)”,一个页在磁盘上占用8K空间, 那么这一个页可以存储上述记录8条,但可以存储索引800条。现在我 们要从一个有8000条记录的表中检索符合某个条件的记录,如果没有 索引的话,我们可能需要遍历8000条×1000字节/8K字节=1000个页 面才能够找到结果。如果在检索字段上有上述索引的话,那么我们可以 在8000条×10字节/8K字节=10个页面中就检索到满足条件的索引块, 然后根据索引块上的指针逐一找到结果数据块,这样IO访问量要少的多。
相关文档
最新文档