5. SQLServer存储引擎——索引的结构和分类

  关系型数据库中以二维表来表达关系模型,表中的数据以页的形式存储在磁盘上,在SQL SERVER中,数据页是磁盘上8k的连续空间,那么,一个表的所有数据页在磁盘上是如何组织的呢?分两种情况:

  一是数据页间无序、随机地存储在磁盘上,这样的表叫做堆表(表上无聚集索引);

  二是数据页间按某个表字段的值有序地存储在磁盘上,这样的表做索引组织表(表上有聚集索引)。

  索引是什么?从物理结构上可分为两种:聚集索引和非聚集索引。将表中的数据有序地组织起来的索引称为聚集索引,一个表只有一个聚集索引,表上其他的B树索引都是非聚集索引。

  (5.1)索引的结构

    聚集索引结构

    1).聚集索引将表内的数据进行有序的组织,并不是指磁盘上数据页内数据的物理顺序,也不是指数据页在磁盘上的物理顺序,而是数据页间逻辑上以树型结构链接起来,结构如下:

create table t
(
ID int,
NAME varchar(100)
AGE int,
)
GO
INSERT INTO t VALUES(1,'张一',20)
INSERT INTO t VALUES(2,'张二',25)
INSERT INTO t VALUES(4,'张三',21)
INSERT INTO t VALUES(5,'李二',23)
INSERT INTO t VALUES(7,'李三',24)
INSERT INTO t VALUES(8,'李四',22)
GO
create CLUSTERED index IX_t_ID on t(ID)

    

    索引组织表中的数据页,除了有IAM页进行管理,页之间还有单向或者双向链表连接。

    2).聚集索引的非叶子节点(即索引节点),只包含下一节点的第一个键值(入口键值)及指向下一节点页的指针,指针的格式为:文件编号+页编号,长度为2Byte+4Byte=6Byte;

        3).聚集索引的叶子节点行就是表中的数据行;

4).没有聚集索引的表,结构如下:

      

      堆表中的数据页之间没有链表连接,随机的存放在磁盘上,仅通过IAM页进行管理。

     5).数据库引擎根据系统表判断当前表为堆表/索引组织表,并查得堆表的first_IAM_page/索引组织表的first_page,即可对表展开扫描;

    非聚集索引结构

     1)非聚集索引是对聚集索引的索引,结构如下:

     2)非聚集索引的索引节点和聚集索引一样,只包含下一节点的第一个键值(入口键值)及指向下一节点页的指针,指针的格式为:文件编号+页编号,长度为2Byte+4Byte=6Byte;

     3)非聚集索引的叶子节点存储的是索引列和书签。     

      如果是堆表,书签为ROWID,长度为8Byte,即数据页号(4Byte)+文件号(2Byte)+槽号(2Byte)的行定位串;

      如果是索引组织表,书签为聚集索引键;    

create NONCLUSTERED index IX_t_AGE on t(AGE)
GO
SELECT * FROM t WHERE AGE=20

      此时想要根据年龄20来查找数据。       如果是堆表,先根据AGE找的应该是ID=1这一行数据的8字节的ROWID,然后再根据这个ROWID去找到该行的所有数据,即(1,'张一',20);       如果是索引组织表,先根据AGE上的非聚集索引找到ID,此时ID值为1,然后再将ID=1带入聚集索引进行等值查找,最终在聚集索引的叶子节点得到该行的所有数据;

     4)无论是聚集索引还是非聚集索引的叶子节点上都有一个指向上下页的指针。

  (5.2)索引的分类    

    SQL SERVER中索引分类

    (1)B+树索引 目前关系型数据库中一种常见的索引组织结构。B+树,它是一多叉平衡排序树,直到叶子节点才会命中数据,以下简称B树,可参见相关《数据结构》的书籍;

    (2)全文索引 目前关系型数据库一种基于标记的索引组织结构,它不是B树结构,而是基于要索引的文本中的各个标记来创建倒排、堆积且压缩的索引结构。

    (3)XML索引 随着XML文本的应用,在各个关系型数据库中也相继提供了对这种数据结构的支持。XML 实例作为二进制大型对象 (BLOB) 存储在 xml 类型列中。对于列中的每个 XML对象,索引将创建几个数据行。该索引中的行数大约等于 XML对象中的节点数。

SQLServer存储引擎——05.索引的结构和分类的更多相关文章

  1. SQLServer存储引擎——06.索引的遍历与维护

    一.遍历 索引树的每个节点都是一个页面. 索引树有三种类型的节点:根节点.中间节点.叶子节点. (1) 根节点与中间节点一样,只包含下一层节点的入口值与入口指针,它们称为索引节点: (2) 叶子节点包 ...

  2. SQLServer存储引擎——02.内存

    SQLServer存储引擎之内存篇: (1)SQL SERVER 内存结构        SQL SERVER 内存结构简图 SQL SERVER 内存空间主要可分为两部分: (1.1)可执行代码(E ...

  3. 史上最全存储引擎、索引使用及SQL优化的实践

    史上最全存储引擎.索引使用及SQL优化的实践 1 MySQL的体系结构概述 2. 存储引擎 2.1 存储引擎概述 2.2 各种存储引擎特性 2.2.1 InnoDB 2.2.2 MyISAM 3. 优 ...

  4. 【MySQL】MySQL(四)存储引擎、索引、锁、集群

    MySQL存储引擎 MySQL体系结构 体系结构的概念 任何一套系统当中,每个部件都能起到一定的作用! MySQL的体系结构 体系结构详解 客户端连接 支持接口:支持的客户端连接,例如C.Java.P ...

  5. SQLServer存储引擎——03.日志

    3. SQLServer存储引擎之日志篇 (3.1)日志结构 (3.1.1)物理日志 (0)物理日志即数据库的.ldf文件, 当然后缀名是可以自定义的,默认是.ldf (1)一个SqlServer数据 ...

  6. SQLServer存储引擎——01.数据库如何读写数据

    一.引言 在SQL Server数据库中,数据是如何被读写的?日志里都有些什么?和数据页之间是什么关系?数据页又是如何存放数据的?索引又是用来干嘛的? 一起看看SQL Server的存储引擎. 二.S ...

  7. MySQL存储引擎,索引及基本优化策略

    存储引擎 与Oracle, SQL Server这些数据库不同,MySQL提供了多种存储引擎.什么是存储引擎?存储引擎其实就是一套对于数据如何存储,查询,更新,建立索引等接口的实现.不同存储引擎特性有 ...

  8. Mysql 版本号、存储引擎、索引查询

    [1]Mysql 版本号.存储引擎.索引查询 # 查看数据库版本号 SELECT VERSION(); # 查看数据库支持的引擎(默认即Support == DEFAULT行) SHOW ENGINE ...

  9. mysql 存储引擎对索引的支持

    一.首先给出mysql官方文档给出的不同存储引擎对索引的支持 从上面的图中可以得知,mysql 是支持hash索引的,但支持和不支持又和具体的存储引擎有关系.从图中看到InnoDB是支持Btree索引 ...

随机推荐

  1. 配置文件的继承与覆盖: Machine.config / Web.config /子目录 Web.config

    C#有三种级别的配置文件: 机器级别 machine.config 在 C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\machine.c ...

  2. Linux cciss磁盘设备文件的说明

    在某些机器上安装Linux后,发现在/dev目录下找不到hda.hdb.sda等磁盘设备文件,那么挂接的磁盘 在哪里呢?使用mount命令查看挂接设备情况,发现磁盘文件在.dev\cciss目录下,并 ...

  3. (转)红帽 Red Hat Linux相关产品iso镜像下载【百度云】【更新6.7 Boot Disk】

    不为什么,就为了方便搜索,特把红帽EL 5.EL6 的各版本整理一下,共享出来. RedHat Enterprise Server 6.7 for i386 Boot Disk:rhel-server ...

  4. PATL2-007. 家庭房产-并查集

    L2-007. 家庭房产 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 给定每个人的家庭成员和其自己名下的房产,请你统计出每个 ...

  5. Oracle 11g R2(11.2.0.4) RAC 数据文件路径错误解决--ORA-01157 ORA-01110: 数据文件

    Oracle 11g R2(11.2.0.1) RAC  数据文件路径错误解决--ORA-01157 ORA-01110: 数据文件 oracle 11g R2(11.2.0.4) rac--scan ...

  6. altium designer 中器件原理图库中,将一个器件分成几部分是如何操作的?就是如何用part表示?

    在SCH Library的Components中选中你要添加part的器件,tools菜单--new part即可

  7. [机器学习基础]矩阵基础和numpy

    矩阵定义:[摘自百度百科] 由 m × n 个数aij排成的m行n列的数表称为m行n列的矩阵,简称m × n矩阵.记作: 这m×n 个数称为矩阵A的元素,简称为元,数aij位于矩阵A的第i行第j列,称 ...

  8. Spring-@value用法详解

    为了简化读取properties文件中的配置值,spring支持@value注解的方式来获取,这种方式大大简化了项目配置,提高业务中的灵活性. 一.两种使用方法 1.@Value("#{co ...

  9. AJAX——XMLHttpRequest对象的使用

    AJAX是web2.0即动态网页的基础,而XMLHttpRequest对象又是AJAX的核心.XMLHttpRequest对象负责将用户信息以异步通信地发送到服务器端,并接收服务器响应信息和数据 一. ...

  10. Runtime机制的使用整理

    一.基本概念 1.1.RunTime简称运行时,就是系统在运行的时候的一些机制,其中最主要的是消息机制. 1.2.对于C语言,函数的调用在编译的时候会决定调用哪个函数,编译完成之后直接顺序执行,无任何 ...