年前最后几天,刚刚提交了最后的工作。终于有点空闲时间了:)
本文叫做《索引浅谈》,那么本文仅仅会简单介绍什么是索引,以及索的及其的简单实现。目的在于帮助给位同学了解什么是索引,以及他是如何使得查询变快的,但是不会深入讨论。更加不会深入讨论索引的实现和优化(这潭水太深了,我连水边都还没到.....)
什么是索引
索引的实现有很多种,用的最多的是一个树结构,链表等等可以加速查询的数据结构
为了方便大家容易理解,我们在这里举一个例子:
现在有一个列叫做unme(只有英文),里面有用户名(abcde,abc,bcd)。为了方便对此列查询需要建立索引,那么对于abcde的索引为a/b/c/d/e(这里是最简单的了,只为告诉大家什么是索引)对abc的就是a/b/c,bcd=》b/c/d。
此时需要查询abcde这个简单,先找a,然后cde.....就找的abcde了。
到这里有人可能要说这个索引没用!!!是的,如果不考虑索引和物理数据存放的位置的话确实没区别。往下看:)
索引如何加速查询
那么看这个,现在要查询所有abc开始的uname。
没有索引:
1、循环数据中的每一行
2、匹配数据是否是abc开头
匹配次数n*l(n=行数,l是abc字符串的长度)
有了如上索引:
1、先在索引集合里面找到a开头的索引(如果是全小写英文就只要判断24次)这里就忽略了所有非a开头的字符串,得到子集合。
2、然后得到一个子集合,然后再在子集合里面查找b开头的数据集合,查询c也是类似
查询次数就是l*(m-k)(m索引的字符的个数,例如全英文小写就是24,英文大小写就是48;k是上一次查找剩余的索引字符总数)
没有索引必须执行n*l次搜索,而有索引的最坏情况就是第l-1次k都为0(一个都没找)第n次就是剩下的所要找的数据,此时为要查找l*m次
假设我们有10000条数据,全部是小写英文,查询abc开头:
无索引的情况下为:10000*3=30000次
有索引的最坏的情况下(k都为0):3*24=72次
到这里就很容易看到结果了吧,索引给我们是如何加速查询的:)
PS:这样的索引很少使用,因为这个是最简单的,也是效率很低的一种树形索引。
PS:写成这样不知道有没有童鞋能看明白,哪里看不明白直接留言。我会尽量回答大家的问题的:)