通俗易懂讲索引(一)

原创文章,转载请注明出处!

本文目的:通过通俗易懂的方式介绍索引的由来和各类索引的优缺点,文章只求让读者对索引由一个感性的了解,并未对索引的性能等做详细探讨。不足之处欢迎批评指正。

一 为什么要用索引?

存在即合理,索引的出现一定有它的原因,否则早已消失。那为什么要用索引呢?假如现在我们有一份商品清单表,这份清单包括这么几项内容:商品的编号,商品的名称,商品的价格和和商品的库存。如果表里只记录了100个商品,那我们想查找一个编号为xx的商品多少钱时,最简单的方法就是从上到下一项一项地挨着看一遍,碰巧了可能第一个就是这样就一下查到了,可是要是碰不巧那就得看到第100个了。要是商品清单中有一万个商品或者有百万甚至上亿个商品呢?如果碰不巧岂不是得看到天荒地老才能查到?所以在数据量很大的时候,提高查询效率非常地重要。而索引出现就是为了解决这个问题。虽然索引种类有很多,形式各不相同,但无论怎么变索引的目的只有一个就是提高搜索效率。

那什么是索引呢?别着急,我们还是回到商品清单上来。现在我们假设商品清单里有1亿条商品记录。为了提高查询的速度,我想到一个办法。那就是把商品编号这一列单独拿出来,然后提前把它从小到大排个序。这样一来,再查找编号为xx的商品时,我就可以用二分法进行查找了,二分法查找的时间复杂度是O(logn),那么从这个已经排好序的编号列表中查到我想要的编号最坏也就不到30次,这可快了不是一点儿半点儿啊。但是光找到这个编号不想啊还是查不到价格,怎么办?那我们就在取编号出来的时候也把编号对应的这条记录的地址也拿出来,这样找到了编号,就找到了这条商品记录的地址,也就能一下查到它的价格了。

这个例子中,所有拿出来的编号和地址就组成了一个索引,某条编号和它对应的地址组成了一个索引项。简单来说,索引就是建立在数据记录的某个或某些属性,如例子中的编号,之上的,并且经过重新组织以提高搜索效率的数据的集合。本质上,索引还是数据,只是为了提高搜索效率它有它的组织形式,如上图的顺序结构,除此之外它还可能组织成树形结构等等。如果你对数据结构不太熟悉,还是需要先去熟悉一下的。

二 索引的分类

在提高数据记录的搜索效率方面,没有那种索引是万能的,只有相对的好还是不好,因此索引也衍生出了很多种类。下面我们就具体来探讨一下不同种类索引。

1 线性索引

线性索引顾名思义,索引的索引项是线性排列的。此外,线性索引还有一个要求就是索引项是顺序排列的不能是无序的。就像上例中的编号是从小到大线性排列的,它就是一个线性索引。

1.1 稠密索引

什么是稠密索引呢?在上面的例子中,我们其实建立的就是一个稠密索引。我们把所有的商品编号全部都拿出来进行了排序,因此商品清单里的每条商品记录与索引项都是一一对应的。我们有1亿条商品记录,就有1亿个索引项。这样的索引就是稠密索引。之所以叫稠密索引就是因为索引项的数量比较多,跟商品记录是一样的。采用二分法的情况下,稠密索引的最坏情况下约需要查找logn次,时间复杂度为O(logn)。

这里写图片描述

稠密索引的好处是我们可以像上面的例子一样采用像二分法一样的算法来提高搜索效率,其效果确实是显而易见的。但是呢,稠密索引也是有很麻烦的缺点,那就是当数据量很大时它的索引项太多了,索引项多就表示数据量很大,数据量大就意味着需要更多的存储空间。而且由于索引始终要维持有序,插入或删除记录时,维护成本也将很高。如果一条索引1KB,那么5亿条索引就得将近5GB,这都放到内存中还是有点吃不消啊。可能有人要说了,我的硬盘1T放5GB绰绰有余。可是,如果真的把索引数据都放到硬盘,我们仍需要把它的一部分加载到内存中,而且需要反复加载不同的部分,这时就得与硬盘进行反复的IO操作,然而机械硬盘的IO操作是很费时的,这样效率还是得不到很大的提升啊。要是能把索引项变少都放到内存里,而且还能用像二分法一样的算法进行查找那就好了。这样的好事有么?当然有。稀疏索引就解决了这个问题。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值