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