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

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对象中的节点数。

--------------------------------------------------------------------------------------  
原文转自:http://qianzhang.blog.51cto.com/317608/1217346
--------------------------------------------------------------------------------------

时间: 2024-10-04 09:46:06

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

SQLServer存储引擎——内存

SQLServer存储引擎之内存篇: (1)SQL SERVER 内存结构       SQL SERVER 内存结构简图 SQL SERVER 内存空间主要可分为两部分: (1.1)可执行代码(Executable Code) 主要包括SQL SERVER 实例中的一些EXE和DLL文件 (0)SQL SERVER 引擎(SQL SERVER ENGINE),SQL SERVER 数据库的主程序: (1)服务端网络库(SERVER NET-LIBRARY),用于与客户端网络库通讯,将TDS包交

SQLServer存储引擎——日志

3. SQLServer存储引擎之日志篇 (3.1)日志结构 (3.1.1)物理日志 (0)物理日志即数据库的.ldf文件, 当然后缀名是可以自定义的,默认是.ldf (1)一个SqlServer数据库,可以定义多个物理日志文件,SQL Server逻辑上把他们当作一个整体,顺序写入日志记录,用完第一个,再用下一个:即第一个日志文件的当前空间,如果没有可分配的VLF时,就会使用下一个日志文件的VLF,直到最后一个日志文件也没有可分配的VLF时,会重新回到第一个日志开始增长:VLF的使用如下图:

Innodb存储引擎索引概述

Innodb存储引擎索引概述 该存储引擎支持两种常见的索引:B+索引.Hash索引. Hash索引 Innodb存储引擎支持的Hash索引是自适应的,引擎会根据表的使用情况自动生成Hash索引,不能人为干预是否在一张表中生成hash索引,Mysql5.5后可以关闭hash索引. B+树索引 B+树索引是目前数据库中最常用的最有效的索引: B+树索引的构造类似于二叉树,根据键值最快的找到数据,B代表balance; B+树索引并不能找到给定键值的所在的行,只能找数据行所在的page,再把page读

InnoDB 存储引擎—索引

1.引言 InnoDB 存储引擎支持以下几种觉的索引: 1.1    B+ 树索引 (平衡树索引) 1.2    全文索引 1.3    哈希索引 InnoDB 存储引擎支持的哈希索引是自适应的, InnoDB 存储引擎会根据表的使用情况自动为表生成哈希索引,也就是说无法人为在表中生成哈希索引. B+ 树索引就是传统意义上的索引,目前关系型数据库中查找最为常用和最为有效的索引用.B+ 树索引引的构造类似于二叉树,根据键值快速找到数据. 注:B+ 树索引不能找到一个给定键值的具体行.B+ 树索引能

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

一.遍历 索引树的每个节点都是一个页面. 索引树有三种类型的节点:根节点.中间节点.叶子节点. (1) 根节点与中间节点一样,只包含下一层节点的入口值与入口指针,它们称为索引节点: (2) 叶子节点包含要遍历的数据,对聚集索引而言数据就是表中数据行,对非聚集索引数据是指索引列值和行书签. 索引的遍历总是从根节点开始,即先根遍历,分为两种:索引扫描和索引查找. (1) 索引扫描,是指从索引树的根节点开始,对叶子节点逐个扫描,直至命中所有满足查找条件的数据: (2) 索引查找,是指从索引树的根节点开

MySql的InnoDB存储引擎--索引

索引分类: 1.聚集索引:索引顺序与物理顺序一致. MySql 的 InnoDB 中,主键索引就是聚集索引.好处是,进行搜索的时候,因为索引和物理顺序一致,所以找数据的时候更快. 2.非聚集索引:索引顺序与物理顺序不一致. 非主键索引. 在非主键索引中,又有组合索引(最左索引:也就是查询的时候如果where条件里面没有最左边的一到多列,索引就不会起作用). 区别: 由于聚集索引的有序性,因此十分适合范围查找.当找到相应的范围区间,就直接获取数据.(类比为数组) 由于非聚集索引的索引顺序月物理存储

(3.8)存储引擎--索引的遍历与维护

一.遍历 索引树的每个节点都是一个页面. 索引树有三种类型的节点:根节点.中间节点.叶子节点. (1) 根节点与中间节点一样,只包含下一层节点的入口值与入口指针,它们称为索引节点: (2) 叶子节点包含要遍历的数据,对聚集索引而言数据就是表中数据行,对非聚集索引数据是指索引列值和行书签. 索引的遍历总是从根节点开始,即先根遍历,分为两种:索引扫描和索引查找. (1) 索引扫描,是指从索引树的根节点开始,对叶子节点逐个扫描,直至命中所有满足查找条件的数据: (2) 索引查找,是指从索引树的根节点开

MySql存储引擎+表解压缩机制+索引+查询缓存机制+慢查询日志

一.大型网站优化之MySql优化 1.优化和不优化的对比的 在业界当中我们有一个叫大数据(big data)的概念,所谓的大数据指代千万级别以上的数据作为起步的数据.所以我们现在需要对两张都具有50331650条记录的表进行查询对比,其中表名为tbl_no的表是没有做过任何优化手段的表,表名为tbl_yes的表是做过优化手段的表.这个实验的目的是观察具有优化手段和不具有优化手段的查询中速度的差别. 实验条件: 1)两张表的数据记录总数是相同的 2)两张表的数据字段结构也是一样的 3)查询的记录的

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

存储引擎 与Oracle, SQL Server这些数据库不同,MySQL提供了多种存储引擎.什么是存储引擎?存储引擎其实就是一套对于数据如何存储,查询,更新,建立索引等接口的实现.不同存储引擎特性有所不同,我们根据需要进行选择,比如包含ETL操作的OLTP(联机交易处理)项目中我们通常选择InnoDB,而对于读操作较多几乎没有写操作的OLAP(联机分析处理)则选MyISAM的更多.因此并不是大家都用环境相似,同一版本的MySQL,能够使用的特性就是一致的.在MySQL终端中查看支持的存储引擎,