sql索引原理_sql索引有什么用

表的存储结构

表 -> 分区 -> 堆或B+树 -> 页(数据页、索引页、LOB页,溢出页)

表默认只有一个分区(sql server的分区表技术,可以将表进行水平拆分,这样就会产生多个分区)。 分区里面就是存储的数据,有两种存储形式:堆或B+树,具体结构下面细说。、

页是数据存储的最小单位。 页类型分为:数据页、索引页、Log_mixed_page、Lob_tree_page、IAM页面

一个数据页可以存储8K(8192字节,减去96字节的头)大小的数据。数据页里面就是数据行,数据行不能跨页。

疑问:那一行数据可以超过8K吗,超过8K不就跨页了吗?

sql server 2000会有这个限制。sql server 2005 突破了每行8K的限制 但是sql server列的大小,仍不能超过8K(比如你不能定义varchar(9000) 或者 nvarchar(5000));

如果一行数据超出了8K,那么超出8K的字段会存到溢出页上,原数据行上有个指针指向到溢出页。

有人可能会说 varchar(max)、nvarchar(max)、text、image这种类型,其实不然,这种类型是LOB类型。

LOB(large object)是一种用于存储大对象的数据类型,每个LOB可以有2GB。LOB列可以跨多页,并且页不一定是连续的。

区(又叫扩展区)

区(又叫扩展区)是页的集合,一个区包括了8个页,区大小是64K。 注意:这里的区,不是表分区。每个表默认只有一个表分区。

堆结构

堆是一个没有聚集索引的表。表中的数据不按任何字段排序。 用"索引分配映射(IAM)"页将堆的页面联系在一起。如下图所示:

sql索引原理_sql索引有什么用

堆内的数据页和行没有任何特定的顺序;页面也不链接在一起,数据页之间唯一的逻辑连接是记录在IAM页内的信息, 页面与页面之间没有什么紧密的联系;用IAM页查找数据页集合中的每一页。 从数据存储管理上来讲,用堆去管理一个超大的表格是比较吃力的,经常使用的表格上都建立聚集索引。

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

索引

MSSQL的索引存储结构是B+树,这是一种平衡多叉树。

B树和B+树的区别

sql索引原理_sql索引有什么用

B树的索引节点里面除了键值和指针之外,还有行数据。

sql索引原理_sql索引有什么用

B+树的索引节点里面,只有键值和指针。b+树的叶节点是个双向链表,范围查找非常快速。

为什么B+树更适合做索引?

1,因为页容量是固定的,所以B+树能容纳更多的索引值,那么索引深度就相对较浅,查找性能会更好。

2,b+树叶级节点之间,是个双向链表,范围查找很快。

B+树结构:

当一个表上加了聚集索引后,其结构即成了一个B+树,数据记录成了B+树的一部分。 数据的物理顺序按索引字段的顺序来排列,因为物理排列顺序肯定是只有一种的,所以表上只能添加一个聚集索引。

聚集索引

下图是一个单字段聚集索引的存储结构图(假设是在Name上加的聚集索引)

sql索引原理_sql索引有什么用

  1. 聚集索引是以B树结构存储的。根节点和中间节点都是索引页,叶子节点是数据页。
  2. 当表加了聚集索引的话,数据就不是按堆存储了,而是按B树结构存储的,数据记录成了B树的一部分,是B树的叶子节点。
  3. 索引页里面包含的是索引行,索引行由索引键值和指针构成,指针指向的是下一级索引的页ID。如果下一级是数据页,则指向的就是数据页ID(不是数据行的ID)。数据页里面包含的就是数据行,如果数据行大小超过8060字节,那么超出的部分会存到溢出页,此行数据会有一个指针指向溢出页。上面的图有一个缺陷(页之间的关联没有标明),相同层级的索引页之间是相互关联的,是个双向链表,每个索引页都有指针指向上下一页。数据页也是一个双向链表,都会指上一页和下一页。数据在物理上不一定是连续的,但是在逻辑上一定是连续的。所以范围查询的时候是很快的。
  4. 数据是有序的,按照聚集索引字段的顺序来排列,所以一个表只能有一个聚集索引。如上图所示最右边的数据记录很明显可以看出是按照Name升序来排列的。
  5. B+树的查找方式:如上图数据所示,假设要查找Name=Greene的记录

从根节点开始查找: >= ‘Bennet’ 且 < ‘Karsen’ 的数据 --> 进入索引页1007 (Greene的记录应该再查找此页) >= ‘Karsen’ 且 < ‘Smith’ 的数据 --> 进入索引页1009 >= ‘Smith’ 且 < xxxxxxx 的数据 --> 进入索引页1062 再从中间节点索引页1007查找: >= ‘Bennet’ 且 < ‘Greane’ 的数据 --> 进入数据页1132 >= ‘Greane’ 且 < ‘Hunter’ 的数据 --> 进入数据页1133 (Greene的记录应该再查找此页) >= ‘Hunter’ 且 < xxxxxxxx 的数据 --> 进入数据页1127 最后从数据页1133中取得Name=Greene的这行记录 复制代码

根节点的索引键值是如何决定的?

1,根节点里面的存储索引键值是如何决定的?为什么是zhangsan,而不是lisi或者其他?

  1. 取每个数据页的第一条的索引键值,向上形成索引页。
  2. 再用最底层的每个索引页的第一条向上形成索引页,这样依次向上推,直到根节点。这样根节点的索引键值就出来了

PS:即第一条记录肯定是在根节点里面的,下面的DBCC分析也佐证了这点。

索引的层数如何决定的?

假设某表里1亿行数据,并且这1亿行数据刚好构成了1000万个数据页,

聚集索引字段是个Int型字段(Int类型为4字节),一个索引页只能存储8K(8060字节)数据的:

  1. 那么数据页上层需要 4000万字节/8060字节=4963个索引页。 (因为索引指向是索引页的ID,所以数据页上层的索引只需要4000万字节)
  2. 再上一层(4963*4)/8060 = 3个索引页
  3. 再上一层1个索引页即可,至此就是根节点了。

索引的层数(即索引深度)是由索引键的大小和数量决定的。

组合聚集索引的结构

在索引行里会有多个索引键的值,如下图所示。下图截取自DBCC分析的内容

sql索引原理_sql索引有什么用

非聚集索引

非聚集索引和聚集索引的区别是:叶级不再是数据页,即数据不再是索引结构的一部分。

非聚集索引的叶级存储的内容是什么呢? 可以分为两种情况来讨论:堆表上的非聚集索引、聚集表(即有聚集索引的表)上的非聚集索引 其叶级内容是不一样的。

堆上的非聚集索引

sql索引原理_sql索引有什么用

如上图所示,堆表上的非聚集索引叶级节点里,行存储的是索引键值和RID

(行ID,即数据页面里面的数据行的ID)。 这种RID由索引指向的特定行的区段、页以及行偏移量构成。即叶级不是实际的数据,使用叶级也仅仅比使用聚集索引多一个步骤。 因为RID具有行的位置的全部信息,所以可以直接到达数据。差了一个步骤,实际上差别的系统开销是很大的。 因为叶级节点里只存了索引键值和RID,这意味着每个页能够包含的行比聚集索引单个页节点包含的行更多。 根据行ID,可以加载此行所在的数据页来读取数据。sql server 读取数据是以页为单位的,即使只读取一行,也要加载整个数据页

B+树上的非聚集索引

sql索引原理_sql索引有什么用

如上图所示,叶级节点里存储的是,非聚集索引的键值 和 聚集索引的键值。 根据非聚集索引查询时,先根据非聚集索引的键值来一步一步定位到叶级节点里的索引行,在根据此行内的聚集索引键值,去到索引键值里面查找(也是从根节点一步一步开始查)。

注意,如果表没有聚集索引,建立了非聚集索引,那么非聚集索引使用的是行号,如果此时你又添加了聚集索引,那么所有的非聚集索引引用的RID都要改为聚集索引键。这对性能的消耗是非常大的,因此最好先建立聚集索引,在建立非聚集索引。

1,聚集表上的非聚集索引,叶级节点为什么不再使用RID来定位记录,而要使用聚集索引的键值来定位?

如果使用RID定位的话,如果数据页发生了页拆分,那么新拆分出来的半页数据,索引里面原来对应这个半页数据行的RID,全部要更新为新的RID。

这个过程的效率是十分低下的,因为这半页数据行的非聚集索引,一般都不是在一起的,都是分散在个索引页里面的,查找起来效率很低。 而存储聚集索引键值的话,即使聚集索引发生了数据页拆分,对非聚集索引也没有影响。

优缺点

  1. 缺点:查找效率相对低下,因为非聚集索引查找完后,还得根据聚集索引查一轮。
  2. 优点:真正的数据定位是使用的聚集索引键值,而不是RID。这样发生数据页拆分时,也不用影响非聚集索引。

常见问题分析

使用索引字段查询为什么会提供效率?

因为不再是表扫描,而是使用索引查找,呈几何式提高效率

索引会使得,增、删、改的效率降低吗?具体是如何影响的?

新增

  • 对新增操作来说,效率确实会降低,因为实实在在是多了一步更新索引的操作。新增操作带来的效率影响,更多是在页拆分操作上面。
  • 对聚集索引来说:如果聚集索引键值不是有序递增的,数据可能会在数据页的中间插入,这样会导致数据页拆分(也可能会级联向上导致各级索引页的拆分)。页拆分会导致内部碎片和外部碎片,如果外部碎片过多,范围查找时会导致顺序IO变为了随机IO(磁盘悬臂来回移动读取数据),效率很低下。
  • 页拆分以及向上的级联反应,确实是比较低效的,所以聚集索引字段的趋势有序是十分必要的。
  • 对非聚集索引来说:只要聚集索引是有序的,那么数据页拆分是比较少的。但是新增的数据依然有可能导致索引页的拆分, 这种可能性无法避免,因为不可能把非聚集索引键值也设计为趋势有序递增的。
  • 页拆分详见后面,后面再写

修改

如果修改了索引字段的值,才会导致索引更新。如果没有修改索引字段的话,效率我理解应该是不会降低的

删除

删除了数据,需要更新索引,从而降低效率。

PS:对修改和删除操作来说,虽然更新索引对效率有一定影响,但是要UPDATE或DELETE一行的前提是必须找到一行,因此索引实际上对于有复杂WHERE条件的UPDATE或DELETE也有帮助的。在使用索引定位一行的有效性通常能弥补更新索引所带来的额外开销,除非索引设计不合理。

本文【sql索引原理_sql索引有什么用】由作者: 递归 提供,本站不拥有所有权,只提供储存服务,如有侵权,联系删除!
本文链接:https://www.cuoshuo.com/blog/4081.html

(0)
上一篇 2023-03-08 10:53:20
下一篇 2023-03-08 11:02:36

相关推荐

  • win10结束进程命令

    IT之家 2 月 16 日消息,微软今天推出了 Windows 11 Dev 预览版 Build 25300,除了官方更新日志中提到的一些功能之外,该预览版还有一个隐藏功能,那就是可以直接在任务栏操作结束任务进程。 我们知道,在 Windows 11 和 Windows 10 中,当一个应用程序或任务没有响应时,需要打开任务管理器,找到任务名称,然后结束其进…

    2023-03-10
    300
  • 火车票自动刷票软件叫什么(自动抢高铁票用什么软件好)

    还有两个月,春节就要到了,能否抢到回家的火车票成为很多人的心头病。如今有了好消息!据媒体报道,中国铁路客票发售和预订系统研发的技术带头人单杏花透露,她和团队研发的“候补购票”功能将于2019年春运期间上线,届时抢票情况将会再次得到缓解。 支付预购资金 软件将自动购票 2019年春运期间,旅客如果遇到车票售完的情况,在12306平台登记购票信息支付预购票资金后…

    2023-03-15
    000
  • pdb数据库是什么数据库_pdb文件用什么打开

    蛋白质结构数据库(RCSBProtein Data Bank) PDB蛋白质结构数据库(全称ProteinDataBank,简称PDB数据库)是美国Brookhaven国家实验室于1971年创建的,由结构生物信息学研究合作组织(ResearchCollaboratory for StructuralBioinformatics,简称RCSB)维护。PDB数据…

    2023-03-20
    400
  • 矩阵键盘程序流程设计 单片机矩阵键盘程序

    1. 基于proteus的51单片机开发实例24-矩阵键盘 1.1. 实验目的 本实例我们来学习矩阵键盘(行列式键盘)的电路设计、编程实现。目的是通过较少的I/O口来识别多个按键。 1.2. 设计思路 我们在前面已经学习过独立按键,在独立按键电路中,一个按键连接单片机的一位I/O端口。这样通过检测I/O的状态就能很方便的识别该按键是否按下。这种电路的优点是:…

    2023-03-18
    000
  • ubuntu安装flash player

    看到这篇文章说明你已经从老版本升级到 Ubuntu 16.04 或进行了全新安装,在安装好 Ubuntu 16.04 LTS 之后建议大家先做如下 15 件事。无论你是刚加入 Ubuntu 行列的新用户,还是有经验的老用户,你都会发现一些非常有用的调整和建议。 1.了解Ubuntu 16.04 LTS新特性 新选项!新应用程序!新内核!新的…… 所有东西都是…

    2023-03-21
    000
  • discuz教程 搜索热词推荐

    discuz本身的搜索功能其实非常强大!除了可以精确搜索,还支持正则匹配和简单的模糊搜索!那么如何进行呢? 1,精确搜索方法 discuz精确搜索是指输入完全匹配或者完全匹配部分的搜索方式!比如我要搜索一个discuz模板,名字叫做【迪恩游戏Time风 商业版】,那么使用精确搜索的方式你可以搜索【迪恩游戏Time风 商业版】或者【迪恩游戏Time】或者【Ti…

    2023-03-17
    200
  • 微信小应用是不是有挂_微乐游戏真的有挂吗

    受新冠肺炎疫情的影响,从2020年春节开始,很多人宅在家中,玩起了手机游戏。其中,微信小游戏用户暴增,成为了最受欢迎的小游戏。 微信小游戏迅速升温 相对于体积较大的APP游戏和网络游戏来说,小游戏一般是指体积较小、无需安装、玩法简单,通常为休闲益智类主题的游戏。近一段时间,微信小游戏的用户数据增长了50%。 2017年底,微信推出的小游戏“跳一跳”风靡一时 …

    2023-03-09
    600
  • bak文件恢复AUTOCAD图形 cad打开后出现bak文件

    操作步骤: 1.显示文件扩展名 打开计算机,依次点击“工具→文件夹选项→查看”,然后把“隐藏已知文件类型的扩展名”前面的钩去掉,如下图所示: 2.显示所有文件 点击“确定后”,再按照1中的顺序,找到目录“查看→隐藏文件和文件夹→选显示隐藏的文件、文件夹和驱动器”。 3.找到备份文件(它的位置可以在工具→选项→文件→临时图形文件位置查到),将其重命名为「.DW…

    2023-03-20
    100
  • vhdl分频器时钟频率50MHz,10分频器的VHDL代码

    7. 分频器设计(分频输出:1Hz或2Hz的信号) 要求:实验开发板上有一个50MHz的时钟脉冲(此频率过高,接到开发板的LED灯后,无法观察到LED灯一 亮一灭的过程),设计一个分频器,使得分频后的时钟脉冲接到开发板上的LED灯后,肉眼可以观察到LED灯 闪烁。 8. 设计一个十进制加法计数器 使用设计的分频器的输出信号作为计数器的时钟输入,再利用第二次实…

    2023-03-18
    100
  • 适配器未连接怎么解决

    相信网友们都会遇到电脑大大小小的问题故障,一般是先要检查电脑的系统问题和电脑的硬件问题,下面小编针对此问题整理相关的解答。 方法如下: 一、可能电脑的无线适配器的问题。建议去其它的设备插入看看,还是不行,只能更换一个适配器。 二、网卡驱动可能需要更新。 1,电脑可以下载个驱动精灵检测一下,会有提示要更新升级的。 2,系统自带的更新功能。 (1)右击我的电脑,…

    2023-03-12
    400

发表回复

登录后才能评论
返回顶部
错说博客上线啦!