[数据库基础]——索引详解
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[数据库基础]——索引详解相关的知识,希望对你有一定的参考价值。
在列[WordName] 上创建hash 索引是一个很好的。这时,列值将插入到hash 表中和一个键对应,并和实际的数据行有一个映射关系,也就是该键是一个指向表中数据行的指针。hash 表实际是基于关联数组,假如有这样一个语句“boyce = 0×28936”,0×28936是关联到存储在内存中的boyce。在hash表索引中查找“boyce”的值并返回内存中的数据,要比检索整个表的[WordName]列值要快得多。
照这样的说法,是不是以后创建hash 索引好了?
其实不然
hash 表不是一个被排序的数据结构,很多类型的hash索引查询根本就没有性能的提升。比如。检索300页以内的所有单词。因为,hash 表擅长的是检索键值对,也就是说,检索语句检查相等性(如,“WHERE [WordName] = “boyce” ”)。在hash 表中的键值是没有排序的,在存储的时候也没有任何的排序规则。因为hash 索引不够灵活。所以,hash 索引不是默认索引的数据结构。
是不是,创建所有的索引使用默认的b-tree数据结构就完事大吉了呢?
下面的情况还是最好考虑使用hash 索引:
表中存在字段过长,这样的列是不适合创建索引的,创建索引的原则是索引不能太宽。
对于varchar(max)、nvarchar(max) 和 varbinary(max)的大值数据类型也不适合创建索引。
使用R-tree 数据结构的索引,这个主要是解决一些特定的问题。比如,找到方圆五百米的美女/帅哥,这是使用R-tree 索引,性能会有一定的提升。
还有bitmap 索引,在列值为Boolean值时,该类索引是相当有效的。一般用在选择性列上。
有一个问题:在索引中检索一个值(比如,boyce),是怎么样也找到该行其他的列的值呢([WordID]、[WordPage]……)?
可能会说,So easy!因为存在指针。
是这样的,还是让我来啰嗦一下。
索引中存储指向相应行的指针。这个指针是关联到一块内存,该内存中存储了相应数据在硬盘的地址。也就是说,添加为索引的列值是存储在索引中,指向相应数据行的指针也是存储在索引中。这就意味着,[WordName] 在索引中就是像这样(“boyce”,“0×82937”),那么,0×82937的地址就是“boyce” 所在行在磁盘中的地址。通过这个例子,可以看出, 单值得指针其实没有用的,是没有意义的,因为他不能得到相应数据行的值。
索引创建在表的列上,这个概念大家已经非常清晰了。索引只是存储了特定的列,并没有把表中所有的列全部存储到索引中。例如,在[WordName] 列上创建索引,这就意味着,[WordID],[WordPage]…… 没有存储在索引中。如果创建索引在所有的列上,那就相当于把 整个表复制了一份,这会占据很大的空间并且效率也很低。
现在我们知道,创建索引其实会占据一定空间的,越大的表,创建索引占据的空间越大。还有,在所添加、删除、和更新行的时候,都需要相应的维护索引,这样数据库的性能可能会降低。
一般的规则,被频繁检索的列,才在该列创建索引。
http://www.cnblogs.com/BoyceYang/p/3190219.html
以上是关于[数据库基础]——索引详解的主要内容,如果未能解决你的问题,请参考以下文章