百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 文章教程 > 正文

索引的作用与结构(数据库) 索引的作用与分类

xsobi 2024-12-30 07:46 1 浏览

一、索引概述

1、什么叫索引

数据库中的索引与书籍中的索引类似,在一本书中,利用索引可以快速查找所需信息,无须阅读整本书。在数据库中,索引使数据库程序无须对整个表进行扫描,就可以在其中找到所需数据。

书中的索引是一个词语列表,其中注明了包含各个词的页码。而数据库中的索引是某个表中一列或者若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单


2、索引的作用

  • 通过创建唯一索引,可以保证数据记录的唯一性。
  • 可以大大加快数据检索速度。
  • 可以加速表与表之间的连接,这一点在实现数据的参照完整性方面有特别的意义。
  • 在使用ORDER BY和GROUP BY子句中进行检索数据时,可以显著减少查询中分组和排序的时间。
  • 使用索引可以在检索数据的过程中使用优化隐藏器,提高系统性能

二、SQL Server索引下的数据组织结构

在 SQL Server 数据库内,索引对象作为 8 KB 页的集合存储。

SQL Server 支持视图上的索引。视图上第一个允许的索引是聚集索引。在视图上执行 CREATE INDEX 语句时,视图的结果集被具体化,并且存储在与有聚集索引的表具有相同结构的数据库中。

每个表或索引视图的数据行存储在 8 KB 数据页集合中。每个数据页都有一个 96 字节的页头,其中包含象拥有该页的表的标识符 (ID) 这样的系统信息。如果页链接在索引列表中,则页头还包含指向下一页及前面用过的页的指针。在页尾有行偏移表。数据行填充页的剩余部分。


1.堆集结构

堆集在 sysindexes 内有一行,其 indid = 0

sysindexes.FirstIAM 列指向 IAM 页链的 IAM 首页,IAM 页链管理分配给堆集的空间。

SQL Server 2000 使用 IAM 页在堆集中浏览。堆集内的数据页和行没有任何特定的顺序,也不链接在一起。数据页之间唯一的逻辑连接是记录在 IAM 页内的连接。

通过扫描 IAM 页可以对堆集进行表扫描或串行读,以找到容纳这个堆集的页的扩展盘区。因为 IAM 按扩展盘区在数据文件内存在的顺序表示它们,所以这意味着串行堆集扫描一律沿每个文件进行。使用 IAM 页设置扫描顺序还意味着堆集中的行一般不按照插入的顺序返回。


2.聚集索引结构

  • 聚集索引对表的物理数据页中的数据按列进行排序,然后再重新存储到磁盘上,即聚集索引与数据是混为一体的,它的叶节点中存储的是实际的数据。
  • 每个表只能有一个聚集索引,因为数据行本身只能按一个顺序存储。
  • 应当在创建任何非聚集索引之前创建聚集索引。
  • 聚集索引的大小平均是表的5%。
  • 在创建索引时系统需要比索引的表1.2倍的磁盘空间,索引创建完成后自动回收。
  • 聚集索引在 sysindexes 内有一行,其 indid = 1。数据链内的页和其内的行按聚集索引键值排序。所有插入都在所插入行中的键值与排序顺序相匹配时执行。
  • SQL Server2000 将索引组织为 B 树。索引内的每一页包含一个页首,页首后面跟着索引行。每个索引行都包含一个键值以及一个指向较低级页或数据行的指针。索引的每个页称为索引节点。B 树的顶端节点称为根节点。索引的底层节点称为叶节点。每级索引中的页链接在双向链接列表中。在聚集索引内数据页组成叶节点。根和叶之间的任何索引级统称为中间级。
  • 对于聚集索引,sysindexes.root 指向它的顶端。SQL Server 沿着聚集索引浏览以找到聚集索引键对应的行。


在lname列上创建索引后,查询employee表可以看出表中记录是按lname值的顺序排列;删除lname列上的聚集索引,而在emp_id上创建聚集索引后,表中记录按照emp_id列值顺序排列。

3.非聚集索引

  • 非聚集索引具有完全独立于数据行的结构,使用非聚集索引不用将物理数据页中的数据按列排序。非聚集索引的叶节点存储了组成非聚集索引的关键字值和行定位器。
  • 如果索引时没有指定索引类型,默认情况下为非聚集索引;
  • 应当在创建非聚集索引之前创建聚集索引;
  • 每个表最多可以创建249个非聚集索引;
  • 最好在唯一值较多的列上创建非聚集索引;
  • 经常需要联接和分组查询,应在联接和分组操作中使用的列上创建多个非聚集索引,在任何外键列上创建一个聚集索引。
  • 非聚集索引与聚集索引一样有 B 树结构,但是有两个重大差别:

1、数据行不按非聚集索引键的顺序排序和存储。

2、非聚集索引的叶层不包含数据页。 相反,叶节点包含索引行。

  • 非聚集索引可以在有聚集索引的表、堆集或索引视图上定义。在 SQL Server 中,非聚集索引中的行定位器有两种形式:

1、如果表是堆集(没有聚集索引),行定位器就是指向行的指针。该指针用文件标识符 (ID)、页码和页上的行数生成。整个指针称为行 ID。

2、如果表有聚集索引,或者索引在索引视图上,则行定位器就是行的聚集索引键。


4.扩展盘区空间的管理

索引分配映射表(IAM)页映射数据库文件中由堆集或索引使用的扩展盘区。

对于任何具有ntext、text和image类型的列的表,IAM页还映射分配给这些类型的页链的扩展盘区。

这些对象中的每一个都有由一个或多个记录所有分配给自己的扩展盘区的IAM页组成的链。

每个对象对每个包含扩展盘区的文件都至少有一个IAM。

如果分配给对象的文件上的扩展盘区的范围超过了一个IAM页可以记录的范围,则扩展盘区可能会在文件上有多个IAM页。


IAM页按需要分配给每个对象,并在文件内随机定位。

Sysindexes.dbo.FirstIAM指向对象的IAM首页,这个对象的所有IAM 页用链条链接在一起。

IAM 页的页首说明IAM所映射的扩展盘区范围的起始扩展盘区。

IAM中还有大位图,该位图内的每个位代表一个扩展盘区。

位图的第一个位代表范围内的第一个扩展盘区,第二个位代表范围内的第二个扩展盘区,依此类推。

如果一个位是0,则不将它代表的扩展盘区分配给拥有该IAM的对象。如果这个位是1,则将它代表的扩展盘区分配给拥有该IAM页的对象。


相关推荐

MySQL 正则表达式最全介绍

MySQL支持使用正则表达式进行模式匹配和文本搜索。正则表达式提供了一种强大的工具,可以用来匹配和检索字符串中的复杂模式。MySQL中的正则表达式功能主要在REGEXP或RLIKE运算符中使用。1....

正则前面的 (?i) (?s) (?m) (?is) (?im) 是什么意思

Q:经常看见的正则前面的(?i)(?s)(?m)(?is)(?im)是什么意思?...

SQL中的正则表达式

正则表达式通常用来匹配字符,比如在一段字符中截取我们想要的字符,又或者将不想要的字符串替换,或者统计某个或者某几个字符出现的次数,我们都可以使用Oracle提供的正则表达式语法来完成。1.比如,我们在...

学习VBA,报表做到飞 第四章 正则表达式 4.10 贪婪模式与懒惰模式

第四章正则表达式4.10贪婪模式与懒惰模式正则表达式匹配时默认为贪婪模式,也就是尽可能多的匹配。有时候我们需要对符合条件的内容分开匹配,就要用到懒惰模式。...

Python re模块 正则表达式之compile函数

一、应用场景为了重复利用同一个正则对象,需要多次使用这个正则表达式的话,使用re.compile()保存这个正则对象以便复用,可以让程序更加高效。二、使用方法...

几条常用的JavaScript正则表达式

在做项目或者代码编写过程中,一般会遇到验证电话、邮箱等格式是否正确合法的问题。通常我们会使用正则表达式,自己写很麻烦,且正则表达式又不是那么容易记住。所以现在分享几条常用的正则表达式,需要的时候直接复...

C语言中使用正则表达式

POSIX规定了正则表达式的C语言库函数,参见regex(3),我们已经学了很多C函数的用法读者应该具备自己看懂man手册的能力C语言中使用正则表达式一般分为三步:1.编译正则表达式regco...

VBA与Excel入门系列-12-正则表达式(上篇)

系统环境:Windows10...

系列专栏(八):JS的第七种基本类型Symbols

ES6作为新一代JavaScript标准,已正式与广大前端开发者见面。为了让大家对ES6的诸多新特性有更深入的了解,MozillaWeb开发者博客推出了《ES6InDepth》系列文章。CSDN...

EXCEL正则表达式的基础语法

正则表达式的基本概念及用途了解之后,我们就来学习下具体的语法,先以一个简单的例子来讲解。基础语法:比如,A1单元格中有一串字符:aabbccdd...

这几个冷门到你没听过的App,好用到为你打开新世界大门

一些好用的App总被埋没在数以百万计的应用商店中。今天为大家推荐几款Windows、Android、iOS、macOS平台里略显小众、但足够好用的遗珠App。万彩办公大师(Windows)转换Offi...

C/C++知识分享:C语言正则表达式

C语言的正则表达式规则,特此跟大家分享。一、C语言如何使用正则表达式?C语言使用正则表达式的方法很简单,只需要包含正则表达式头文件即可:...

Github工具库(二)

作者:Yunying...

在 JavaScript 中替换所有指定字符 3 种方法

在JS没有提供一种简便的方法来替换所有指定字符。在Java中有一个replaceAll(),replaceAll(Stringregex,Stringreplacement))方法...

正则表达式进阶

正则表达式,是每个程序员的必备的技能1.贪婪匹配和惰性匹配...