标签:
写在前面的废话: 索引这个知识点,我前前后后不知道看了多少边,网上的文章五花八门,搞的我晕头转向,搞的牛逼点的就是测试索引带来的好处,还搞一大堆的测试数据出来,有意思吗?MS自己不会测试吗?这样的测试有意思吗?这些测试我想知道为了证明什么……明显欺负我们这些不懂索引的屌丝。思来想去,自己动手丰衣足食!索引这东西就是个很抽象的东东,网上有很多跟索引一样抽象的文章,让我这屌丝实难看下去,更别说看懂了,看来看去,截至我写这片博客时,我仅仅知道索引分为聚集和非聚集索引……哈哈!无奈啊!下面我就从我的几个疑问开始,为自己解惑!正在更新修改中…… 下文有错误哟!
1、为什么引入索引
2、索引为什么分类
3、索引的结构是怎样构建的
4、索引的维护代价和正确使用
第一问? 为什么引入索引
一个大数据表,查找其中一条数据,怎么找?废话,当然一条条的找!会累啊!怎么办,像我这样聪明的人就开始想了,把数据给规范下,或者排个序啥的,查找就简单了,可是,怎样排序呢?将表中数据全部排序?每次有新数据进来都将新数据插入排好序的地方,这是笨方法!在想别办法,我可以再搞一个‘表’这样的东西,记录插入新数据的物理地址,这样在原有表的基础上,我新‘表’的数据量就小很多,这个小‘表’就是索引,里面的数据对查找数据是相当有用的,理论上需要两个字段,第一:真实数据的物理地址;第二:主键(哪个真是数据的物理地址);这是个小表,随我们怎么操作,但是对于建立索引之前的数据怎么处理?没办法,一条条的找,找到再将关键性的两个字段插入索引就OK了!所以在对已有大数据的表建索引的时候,很费劲的!总结:为了快点找到所需数据!
第二问? 索引为什么分类
针对上文所说的笨方法,其实就是聚集索引,将数据排序,MS是按照很上档次的平衡二叉树算法排序的,排序之后,数据就很规范的聚在一起了,就叫聚集索引,同样数据同样算法排序结果一样,索引聚集索引只有一个!这样看来,就接地气的多,什么算法,不就排个序吗?西方人,就喜欢搞名词,也无非是跟爱迪生一样一个个的试,哪个对大数据排序最快,就用那个算法!都说这是笨方法,MS默认的索引就不是聚集索引,谁闲着没事把大数据排序啊!人都是聪明的,当然采用聪明的方法!非聚集索引就是了,就是上文小表的做法,不动大数据,在搞个小表记录必要信息即可,在小表上找到主键对应的物理地址就oK了,拿着物理地址,直接就找到真实数据了!这样的小表可以有多个,真实数据的主键虽然是唯一的,但是有很多字段也是唯一的只不过没被选中作为主键,这样的字段也可以与物理地址一起构建一个新表,所以非聚集索引可以有多个,由于没有排序真实数据,真实数据也就没有按照一定规则紧挨着,所以就叫做非聚集!总结:为了快点找数据,一个聪明人和笨蛋的想出来的不同方法!另外,表有两种组织方式,B树(Balance Tree)或者堆(Heap)!也知道为什么了吧!B树表因为表数据被搞过了。
第三问? 索引的结构是怎样构建的 这个是重头戏
解决第二问,问题紧接着就来了,逻辑上聚集索引和非聚集索引很简单,但在真实的数据库怎么做到呢?聚集索引的结果是个B树结构的数据表,但是实现的过程是怎会样呢?非聚集索引又是怎样呢?真正的聚集索引和非聚集索引这个东西究竟是啥?先不去管MS或者其他数据库开发者,怎么解决,自己想一想?
先说,聚集索引,既然给大数据排序,首先有排序算法,这个好说(http://www.cnblogs.com/lwzz/archive/2011/07/27/2119021.html)公认的B树算法,但是这么多的数据,怎么才能听我的话,按照算法排好队呢,我又不是他爸,凭啥听我的?还有就是,人家排队的前提是,有多余空间才能移动吧!
http://www.cnblogs.com/lwzz/archive/2012/08/05/2620824.html
http://www.cnblogs.com/knowledgesea/p/3672099.html#top
附上B算法总结:
B树:二叉树,每个结点只存储一个关键字,等于则命中,小于走左结点,大于走右结点;
B-树:多路搜索树,每个结点存储M/2到M个关键字,非叶子结点存储指向关键字范围的子结点;
所有关键字在整颗树中出现,且只出现一次,非叶子结点可以命中;
B+树:在B-树基础上,为叶子结点增加链表指针,所有关键字都在叶子结点中出现,非叶子结点作为叶子结点的索引;B+树总是到叶子结点才命中;
标签:
原文地址:http://www.cnblogs.com/java-oracle/p/4817981.html