写在前面的废话: 索引这个知识点,我前前后后不知道看了多少边,网上的文章五花八门,搞的我晕头转向,搞的牛逼点的就是测试索引带来的好处,还搞一大堆的测试数据出来,有意思吗?MS自己不会测试吗?这样的测试有意思吗?这些测试我想知道为了证明什么……明显欺负我们这些不懂索引的屌丝。思来想去,自己动手丰衣足食!索引这东西就是个很抽象的东东,网上有很多跟索引一样抽象的文章,让我这屌丝实难看下去,更别说看懂了,看来看去,截至我写这片博客时,我仅仅知道索引分为聚集和非聚集索引……哈哈!无奈啊!下面我就从我的几个疑问开始,为自己解惑!继续学习,持续修改;本人片面之言,有错给予严厉的批评,以免传输错误知识!

1、为什么引入索引

2、索引为什么分类

3、索引的结构是怎样构建的

  第一问?  为什么引入索引

   一个大数据表,查找其中一条数据,怎么找?废话,当然一条条的找!会累啊!怎么办,像我这样聪明的人就开始想了,把数据给规范下,或者排个序啥的,查找就简单了,可是,怎样排序呢?将表中数据全部排序?每次有新数据进来都将新数据插入排好序的地方,这是笨方法!在想别办法,我可以再搞一个‘’这样的东西,记录插入新数据的物理地址,这样在原有表的基础上,我新’的数据量就小很多,这个小‘表’就是一个索引,里面的数据对查找数据是相当有用的,理论上需要两个字段,第一:真实数据的物理地址;第二:主键(哪个真实数据的物理地址);这是个小表,随我们怎么操作,但是对于建立索引之前的数据怎么处理?没办法,一条条的找,找到再将关键性的两个字段插入索引就OK了!所以在对已有大数据的表建索引的时候,很费劲的!总结:为了快点找到所需数据!

  第二问?  索引为什么分类

   针对上文所说的笨方法,其实就是聚集索引,将数据排序,MS是按照很上档次的平衡二叉树算法排序的,排序之后,数据就很规范的聚在一起了,就叫聚集索引,同样数据同样算法排序结果一样,索引聚集索引只有一个!这样看来,就接地气的多,什么算法,不就排个序吗?西方人,就喜欢搞名词,也无非是跟爱迪生一样一个个的试,哪个对大数据排序最快,就用那个算法!都说这是笨方法,MS默认的索引就不是聚集索引,谁闲着没事把大数据排序啊!人都是聪明的,当然采用聪明的方法!非聚集索引就是了,就是上文小表的做法,不动大数据,在搞个小表记录必要信息即可,在小表上找到主键对应的物理地址就oK了,拿着物理地址,直接就找到真实数据了!这样的小表可以有多个,真实数据的主键虽然是唯一的,但是有很多字段也是唯一的只不过没被选中作为主键,这样的字段也可以与物理地址一起构建一个新表,所以非聚集索引可以有多个,由于没有排序真实数据,真实数据也就没有按照一定规则紧挨着,所以就叫做非聚集!总结:为了快点找数据,一个聪明人和笨蛋的想出来的不同方法!另外,表有两种组织方式,B树(Balance Tree)或者堆(Heap)!也知道为什么了吧!B树表因为表数据被搞过了。

   第三问?  索引的结构是怎样构建的    这个是重头戏

     首先,我认为SQLSERVER的表结构,原本只有一种,就是堆,数据依次存储(数据按照我前面一片博客 Sql Server专题一:索引(上)

所说的按照数据页、区的规则存储在磁盘中);按照分区组队数据进行组织这样的存储,它不以任何人为指定的逻辑顺序进行排列。注意,MS对数据的管理就是根据这些区管理信息和数据页管理信息来控制的。下面大图1(摘抄:http://www.cnblogs.com/lwzz/archive/2012/08/05/2620824.html)。就是在物理上数据存储的样子,在物理上,数据之间是按照无序状态一条条存储的。在区管理信息中,指明数据页所在区的信息,包括了数据页的分配情况和物理地址等信息,具体的数据页便记录真实数据,堆,就是区和数据页的之间逻辑关系所形成的结构!数据页之间没有逻辑上的顺序!

 

    在此基础上,如果对数据(数据页)进行排序(B树),就打破了堆的结构,还是个人认为区有关的管理信息不会有巨大改变,主要就是数据页,之前在堆中,数据页没有逻辑顺利,现在有了B树的逻辑顺序,数据页和数据页之间有了逻辑和物理上的关系! 在这些关系的最后,才是真实数据!下图就是聚集索引的物理结构!好好的堆结构,被人强制性的施加关系,导致数据页重新按照B树排列,无缘无故多了些关系!本来想拿数据就简单粗暴的在数据页中一个个的找就OK了,现在不行,必须通过关系一步步的才能找到最终数据!看似比原来复杂的多了!但大家都明白,这样的好处是大大的!

     当然,我在第二个问题中说道,聚集索引其实是个笨方法,为什么呢!因为这样的代价有点大!聪明的方法也要实现吧!就是非聚集索引,他的关键主要就是小表,操作对象变为有真实物理地址和主键(哪个真实数据的物理地址)的表,既然B树排序深受广大人民热爱,索性将B树的排序照搬过啦即可!先不说真实的大数据所在的表,单说这个小表,经过B树排序理论上应该跟聚集索引的结构是一样的吧,目前为止,我觉得是一样的。只是你通过种种关系找到最后的小表里面没有数据,你还要在进入小表一次,查看所需数据的物理地址才能找到数据,理论上看似,聚集索引和非聚集索引无非就是一步之差!其实效果相差很大,这个有众多网友已经测试过了!在说真实大数据所在的表,其实根本没有变化,还是堆结构,仅仅是通过小表,变成逻辑上的B树结构。以为目前所理解的,非聚集索引应该指的真实大数据没有聚集(B树),其实小表进行了聚集(B树)看下图:

       上图中(非聚集索引)最后一行的数据页,应该是不按照索引页中顺序排序的,如果是的话,跟聚集索引就一样了。

       总结:SQL SERVER提供了两种索引:聚集索引和非聚集索引。其中聚集索引表示表中存储的数据按照索引的顺序存储,检索效率比非聚集索引高,但对数据更新影响较大。非聚集索引表示数据存储在一个地方,索引存储在另一个地方,索引带有指针指向数据的存储位置,非聚集索引检索效率比聚集索引低,但对数据更新影响较小。B树索引,指的就是索引的本身结构是B树来着的。聚集和非聚集索引的结构都是B树。本文也多次提到B树,B树详情请参考,这位网友的博客:http://www.cnblogs.com/lwzz/archive/2011/07/27/2119021.html

 本文主要参考了:http://www.cnblogs.com/lwzz/archive/2012/08/05/2620824.html

 

Sql Server专题一:索引(中)的更多相关文章

  1. SQL SERVER全面优化-------索引有多重要?

    想了好久索引的重要性应该怎么写?讲原理结构?我估计大部分人不愿意看,也不愿意花那么多时间仔细研究.光写应用?感觉不明白原理一样不会用.举例说明?情况太多也写不全....到底该怎么写呢? 随便写吧,想到 ...

  2. SQL Server 深入解析索引存储(下)

    标签:SQL SERVER/MSSQL SERVER/数据库/DBA/索引体系结构/非聚集索引 概述 非聚集索引与聚集索引具有相同的 B 树结构,它们之间的显著差别在于以下两点: 基础表的数据行不按非 ...

  3. SQL Server 列存储索引强化

    SQL Server 列存储索引强化 SQL Server 列存储索引强化 1. 概述 2.背景 2.1 索引存储 2.2 缓存和I/O 2.3 Batch处理方式 3 聚集索引 3.1 提高索引创建 ...

  4. SQL Server 深入解析索引存储(非聚集索引)

    标签:SQL SERVER/MSSQL SERVER/数据库/DBA/索引体系结构/非聚集索引 概述 非聚集索引与聚集索引具有相同的 B 树结构,它们之间的显著差别在于以下两点: 基础表的数据行不按非 ...

  5. SQL查询优化:详解SQL Server非聚集索引(转载)

    本文是转载,原文地址 http://tech.it168.com/a2011/1228/1295/000001295176.shtml 在SQL SERVER中,非聚集索引其实可以看作是一个含有聚集索 ...

  6. T-SQL查询高级--理解SQL SERVER中非聚集索引的覆盖,连接,交叉和过滤

      写在前面:这是第一篇T-SQL查询高级系列文章.但是T-SQL查询进阶系列还远远没有写完.这个主题放到高级我想是因为这个主题需要一些进阶的知识作为基础..如果文章中有错误的地方请不吝指正.本篇文章 ...

  7. SQL Server 2008 安装过程中遇到“性能计数器注册表配置单元一致性”检查失败 问题的解决方法

    操作步骤: 1. 在 Microsoft Windows 2003 或 Windows XP 桌面上,依次单击"开始"."运行",然后在"打开&quo ...

  8. SQL点滴12—SQL Server备份还原数据库中的小把戏

    原文:SQL点滴12-SQL Server备份还原数据库中的小把戏 备份数据库时出现一个不太了解的错误 ,错误信息“is formatted to support  1 media families, ...

  9. Sql Server与.Net(C#)中星期值对比

    最近发现Sql Server与.Net(C#)中星期值居然不匹配,倒不知道依哪一个了. 1.Sql Server declare @date datetime; set @date = '2017-0 ...

随机推荐

  1. Python学习(四) Python数据类型:序列(重要)

    插播一下,先了解一下Python的数据类型,Python现有的数据类型有好多,最重要的有列表.元组.字典 列表:我觉得可以对应java中的数组 list=['physics', 'chemistry' ...

  2. C语言数组的学习

    什么是数组? 在程序设计中,为了处理方便,把具有相同类型的若干变量按有序的形式组织起来.这些按序排列的同类数据元素的集合称为数组. 在C语言中,数组属于构造数据类型.一个数组可以分解为多个数组元素,这 ...

  3. “弹出DVD驱动器错误”解决方法

    错误描述:(win7环境) 买了个开发板,赠送了一些光盘,放在电脑光驱中打开后,电脑就疯狂响,可能是光盘质量太差.用完后在弹出时显示“弹出DVD驱动器错误”[见图1].直接按主机上弹出按钮也没有反应. ...

  4. ASP.NET MVC 4.0 学习5-ActionResult

    一,Controller簡介 Controller擔任了資料傳遞的角色,負責流程控制,決定存取哪個Model以及決定顯示哪個View頁面,即ASP.NET MVC中有關於『傳遞』的任務皆由Contro ...

  5. C# Directory类

    Directory类 是一个静态类,常用的地方为创建目录和目录管理. 一下来看看它提供的操作. 1.CreateDirectory 根据指定路径创建目录.有重载,允许一次过创建多个目录. 2.Dele ...

  6. No enclosing instance of type Outer is accessible. Must qualify the allocation with an enclosing instance of type Outer (e.g. x.new A() where x is an instance of Outer)

    之前看内部类的时候没发现这个问题,今天写代码的时候遇到,写个最简单的例子: 下面这一段代码 红色的部分就是编译报错: No enclosing instance of type Outer is ac ...

  7. [Oracle] Data Guard 系列(5) - 创建逻辑备库

    在创建逻辑备库之前,必须得先创建物理备库,关于如何创建物理备库,请参考<Data Guard 系列(4) - 在不停主库的情况下创建物理备库>. 1. 在物理备库上停止日志应用服务 SYS ...

  8. UVA 100 - The 3n+1 problem (3n+1 问题)

    100 - The 3n+1 problem (3n+1 问题) /* * 100 - The 3n+1 problem (3n+1 问题) * 作者 仪冰 * QQ 974817955 * * [问 ...

  9. Ffmpeg和SDL创建线程(转)

    Spawning Threads Overview Last time we added audio support by taking advantage of SDL's audio functi ...

  10. telnet如何操作Memcached缓存系统?

    4.(1)telnet操作Memcached 许多语言都实现了连接memcached的客户端,其中以Perl.PHP为主.仅仅memcached网站上列出的语言就有:• Perl • PHP • Py ...