2013-06-06 17:50:49

一、索引的结构

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

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

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

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

1.1、聚集索引结构

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
create table t
(
ID       int,
NAME     varchar(100)
AGE      int,
)
GO
INSERT INTO VALUES(1,'张一',20)
INSERT INTO VALUES(2,'张二',25)
INSERT INTO VALUES(4,'张三',21)
INSERT INTO VALUES(5,'李二',23)
INSERT INTO VALUES(7,'李三',24)
INSERT INTO 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,即可对表展开扫描;

(6)堆表和索引组织表包含的数据行是一样的,只是组织形式不同而已;

1.2、非聚集索引结构

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

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

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

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

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

1
2
3
create NONCLUSTERED index IX_t_AGE on t(AGE)
GO
SELECT FROM WHERE AGE=20

此时想要根据年龄20来查找数据。

如果是堆表,先根据AGE找的应该是ID=1这一行数据的8字节的ROWID,然后再根据这个ROWID去找到该行的所有数据,即(1,'张一',20);

如果是索引组织表,先根据AGE上的非聚集索引找到ID,此时ID值为1,然后再将ID=1带入聚集索引进行等值查找,最终在聚集索引的叶子节点得到该行的所有数据;

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

二、索引分类

1、SQL SERVER中索引分类

(1)B+树索引

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

(2)全文索引

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

(3)XML索引

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

2、B树索引的分类

2.1、物理结构分类

(1)聚集索引

根据索引列值,按B树结构对表内数据进行组织;

(2)非聚集索引

对聚集索引的索引;

2.2、列值唯一性分类

(1)唯一索引

表中索引列的值唯一。

SQL SERVER在唯一性上认为NULL是相等的(ORACLE中唯一键是可以插入多个NULL值的),即唯一键中只允许出现一个NULL值,但在比较运算中认为NULL是不相等的,这点要注意;

(2)非唯一索引

表中索引列的值不唯一;

2.3、列个数分类

(1)复合索引

包含多个列的索引;

(2)单列索引

只包含一个列的索引。

2.4、特殊索引

(1)计算列索引

计算列上的索引;

(2)视图索引

对视图建立索引。

转自:http://blog.51cto.com/qianzhang/1217445

转载于:https://www.cnblogs.com/gered/p/9318470.html

(3.7)存储引擎--索引的结构与分类相关推荐

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

    5. SQLServer存储引擎--索引的结构和分类 关系型数据库中以二维表来表达关系模型,表中的数据以页的形式存储在磁盘上,在SQL SERVER中,数据页是磁盘上8k的连续空间,那么,一个表的所有 ...

  2. 数据结构与索引-- mysql InnoDB存储引擎索引

    索引与算法 索引是我们在应用开发过程中程序数据可开发的一个重要助力.也是一个重要的研究方向,索引太多,应用的性能可能受到影响,如果索引太少,对查询性能又会有制约.我们需要找到一个合适的平衡点,这个对性 ...

  3. mysql存储引擎 索引优化_MySQL存储引擎,索引及基本优化策略

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

  4. WebDay19 MySQL存储引擎 索引 锁 集群

    MySQL存储引擎 索引 锁 集群 一.MySQL存储引擎 1.MySQL体系结构 2.MySQL存储引擎 3.常用引擎的特性对比 4.引擎的操作 5.总结:引擎的选择 二.MySQL索引 1.索引的 ...

  5. mysql:innodb存储引擎之表结构

    文章目录 主键 表结构 表空间(tablespace) 段(segment) 区(extent) 页(page) 页结构 File Header(文件头) Page Header(页头) Infimu ...

  6. MySQL InnoDB 存储引擎索引那些事儿

    InnoDB 存储引擎中,表是根据主键顺序组织存放的,称为索引组织表.每个表都有一个主键,如果没有显示定义主键,则会选择第一个创建的非空唯一索引作为主键,如果没有非空唯一索引,InnoDB引擎则自动创 ...

  7. mysql InnoDb存储引擎索引

    B+树索引:使用B+树索引查找数据时,并不能找到一个给定键值的具体行,只是找到被查找数据行所在的页,然后数据库通过把页读取到内存,再在内存中进行查找,最后得到要查找的数据. 聚集索引:按照表中主键构造 ...

  8. Java 培训 MySQL 体系构架、存储引擎和索引结构

    对某项技术进行系统性的学习,始终离不开对该项技术的整体认知.只有领略其全貌,方可将各块知识点更好的串联起来.为了进一步理解和学习 MySQL,我们有必要了解一下 MySQL 的体系构架.存储引擎和索引 ...

  9. 不同存储结构的文件磁盘io操作次数_MySQL InnoDB存储引擎

    第1章 MySQL体系结构和存储引擎 1.1数据库和实例 数据库:物理操作系统文件或其他形式文件类型的集合.实例:MySQL数据库由后台线程以及一个共享内存区组成.共享内存可以被运行 的后台线程所共享 ...

  10. MySQL:指定索引+事务+存储引擎的配置 开发必备 天呐!为什么会有索引这种东西

    来来来,我告诉你为什么要有索引 索引的概念 索引的作用 索引的分类 普通索引创建的三种方式与删除 创建唯一索引与创建的三种方式 主键索引与创建的两种方式 组合索引 全文索引 创建索引的原则依据 事务的 ...

最新文章

  1. 使用ISE创建IP核(以加法器的IP核建立为例)
  2. 提高mysql千万级大数据SQL查询优化30条经验(Mysql索引优化注意)
  3. iOS实现基于VLC播放器的封装效果
  4. python下载网页中的pdf文件_【Python】Python的urllib模块、urllib2模块批量进行网页下载文件...
  5. Spring(四)——AOP、Spring实现AOP、Spring整合Mybatis、Spring中的事务管理
  6. 五分钟轻松了解Hbase面向列的存储
  7. 使用混合多云每个人都应避免的3个陷阱(第1部分)
  8. [摘抄]隧道尽头的灯
  9. 浅谈“知识库管理系统”
  10. JavaScript基础大总结
  11. 小米游戏本bios_年轻人的第一台游戏本?——小米游戏本2019评测
  12. oracle多表关联索引用法,关联表查询和索引使用的探讨一则
  13. matlab 分水岭法,分水岭算法Matlab实现——三种方法 | 学步园
  14. 【优化算法】灰狼优化算法(GWO)【含Matlab源码 1305期】
  15. 辛普森悖论如何影响AB测试
  16. linux 目录中的文件和子目录生成jar包文件的方法
  17. Linux 挂载nas盘
  18. 请叫我En-Tan-Mo
  19. 1. Pandas 导入导出数据
  20. 大学两年的总结与感悟

热门文章

  1. 计算机网络网络层之层次路由
  2. 网络核心之数据交换-电路交换
  3. Security+ 学习笔记6 了解漏洞的类型
  4. Leetcode 刷题笔记(十七) —— 二叉树篇之公共祖先问题
  5. FIFO算法与LRU算法软考试题
  6. git报错之fatal: protocol error: bad line length character: No This
  7. CSS 属性篇(六):background-size属性
  8. Oracle的三种高可用集群方案
  9. uwp之拍照(使用后置摄像头)
  10. sql server 数据库创建链接服务器访问另外一个sql server 数据库