[数据库基础]——索引详解

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

以上是关于[数据库基础]——索引详解的主要内容,如果未能解决你的问题,请参考以下文章

python数据分析基础之Numpy库详解

python数据分析基础之Numpy库详解

MariaDB基础详解

数据库基础详解:存储过程、视图、游标、SQL语句优化以及索引

python数据分析基础之Numpy库详解

python数据分析基础之Numpy库详解