写在前面的废话: 索引这个知识点,我前前后后不知道看了多少边,网上的文章五花八门,搞的我晕头转向,搞的牛逼点的就是测试索引带来的好处,还搞一大堆的测试数据出来,有意思吗?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. ASP.NET MVC 4.0 学习4-Code First

    之前我們需要用到的數據,通過添加Entity實體數據模型把數據庫中需要的Database拉到項目中如下圖, 而就是Code First就是相對於這種處理數據的方法而言的 Code First更加準確的 ...

  2. web容器 - Jetty

    详解web容器 - Jetty与Tomcat孰强孰弱   Jetty 基本架构 Jetty目前的是一个比较被看好的 Servlet 引擎,它的架构比较简单,也是一个可扩展性和非常灵活的应用服务器. 它 ...

  3. MySQL用户管理语句001

    总的来说mysql的用户管理方法可以分为如下两种: 1.直接对mysql.user 表进行[insert | update | delete] + flush privileges 这种方式主要针对那 ...

  4. I2C串行总线标准驱动程序(C51)-万能程序

    #include "reg51.h" #include "intrins.h" unsigned char SystemError; sbit SCL= P1^ ...

  5. Eclipse中设置注释、日期等信息

    在使用Eclipse 编写Java代码时,自动生成的注释信息都是按照预先设置好的格式生成的,例如其中author,datetime等属性值. 我们可以在Eclipse 中进行设置自己希望显示的注释信息 ...

  6. 剑指offer-面试题13.在O(1)时间删除链表节点

    题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点. 链表节点与函数的定义如下. 通常我们删除某个节点都是从头开始遍历到需要删除节点的前一个节点. 然后使得该节点的next ...

  7. Jconsole: JAVA 监视和管理控制台简介

    Jconsole: JAVA 监视和管理控制台简介 JDK中除了提供大量的命令行之外,还提供两个功能强大的可视化工具:JConsole和VisualVM. 之前对java的调试一直停留在 右键-> ...

  8. 三十二、Java图形化界面设计——布局管理器之CardLayout(卡片布局)

    摘自 http://blog.csdn.net/liujun13579/article/details/7773945 三十二.Java图形化界面设计--布局管理器之CardLayout(卡片布局) ...

  9. vector的内存分配与释放

    1. vector内存分配 <Effective STL>中"条款14":使用reserve来避免不必要的重新分配 关于STL容器,最神奇的事情之一是只要不超过它们的最 ...

  10. 委托、Lambda表达式

    本文来自:http://wenku.baidu.com/link?url=o9Xacr4tYocCPhivayRQXfIc9kOZeWBwPn2FZfeF19P4-8YX5CMXs74WB-Y8t0S ...