白话索引技术

 

索引这个东西由来已久,其目的无非就是为了提高我们的查询速度,想想我们新华字典上的拼音和笔划索引表,通过它我们能够快速找到所需要的汉字,对应于数据库,通过索引我们可以快速找到所需要的记录,由此可见,索引的思想其实是被我们熟知的。

 

如果现在假定一个任务,让你来发明一个数据库,而我们需要在你的表中存储100条数据,请问你应该怎么设计索引,帮助我们快速的查找某一条数据?

 

我想很多人应该都会想到,如果要快速的“定位”一条数据,那么保证数据的有序性非常重要。如果单纯只是100条数据杂乱无章的摆放,就好像进了一个篮子里面大大小小放了100个苹果,如果我们要找出其中最大的苹果,我们不得不一个个苹果去比较,这也就是遍历的思想,非常耗时。而如果我们事先将苹果按由大到小的规则进行了排序,那么队列当中的第一个苹果就是我们想要的。再如果我们不想买大苹果,我们绝对不会从队列的开始去找苹果。因此,对象的“有序”可以帮我们排除一部分数据,从而为我们节约大量的查询时间。

 

上面说了有序的思想,下面说一下应该根据什么对字段进行排序。试想一下,如果我想找age25岁的人,而数据表中的记录却是以name进行排序的,那么这是多么糟糕的事情,因为这样的排序对我们的查找没有任何的帮助,我们还是得遍历数据。而如果我们此时对年龄建立一种排序规则,假设规则为按年龄从小到大排序。通过二分查找法,我们很容易找到年龄为25岁的人。这个事实告诉我们:我们至少应该对经常需要“操作”的字段建立排序规则,即索引。这里的“操作”是一个广义的概念:其可能是JoinWhere,或者Order ByGroup By字段。

 

对一张有主键的表来说,其主键字段一定是我们经常用到的,先不说经常对其进行连接、排序操作,单是简单的更新,删除,我们就必须用到它来定位数据。正因为这样,SQLServer的设计者对我们的主键都会自动建立一个索引。这个索引在SQLServer中被称之为聚簇索引,其索引名称以PK开头,另外还有一种叫非聚簇索引,其索引名称以IX开头。

 

作为一个程序开发人员来说,其实SQLServer 如何实现它的索引技术,并不是我们所关注的重点。只有知道了索引的思想,我们才能解释为什么在索引优化技术中,我们应该对常用字段建立索引,为什么我们写SQL语句时Order By 字段的顺序必须要和复合索引中字段的顺序一致(试想一下新华字典如果索引的规则是先声母后韵母,而我们现在如果说要按先韵母后声母查字,那么实际我们是根本没法用索引,呵呵)。

 

既然索引能提高查询速度,那何不为每一个字段都建立一个索引。这里主要有时间和空间的成本问题。时间上,当我们新增或删除数据时,索引是需要维护的。自然索引越多,耗时越长。空间上,索引存储当然也是要占用一定的空间的,自然也是索引越多,空间越大。

 

     这里有一个问题:如果一张表有30个字段,平均下来,每个字段的使用频率都差不多,那么我们应该为每个字段都建立索引吗?还望各位拍砖,呵呵。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值