数据库的索引

来源:互联网 发布:交换机端口绑定ip地址 编辑:程序博客网 时间:2024/06/02 09:58

索引这个东西很抽象,今天就来探究一下,它究竟是用来干什么的?它的原理又是什么?

索引的英文是index,在MySQL里面建立索引的关键字是key

索引是对字段建立的,可以是一个字段,可以是多个字段

对多个字段建立索引的时候,在第一个字段相同时才按第二个字段来排序,并以此类推。

假如我们要对name, country, age这3个字段建立一个索引,语句为key(name, country, age)


1.数据在数据库中的存储

数据库的存储底层是文件系统,文件系统是按块(chunk)来组织的。

数据库查询的主要消耗就是对于块的读取,可以用对块的读取次数来表示数据库的读取时间。

优化的目标其实就是在查询的时候查到同样的数据尽量减少对于块的读取。


2.什么是索引

假设我们有m条记录,每次读取一个块,一个块可以存n条记录。

那么我们平均需要读取二分之m/n次外存(这里假设查询的关键字是唯一的)。

现在我们想要进行二分查找式的搜索,以提高搜索效率。

那我们应该怎么办呢?

将索引的字段,按照某个可比较的顺序先排个序。

但是问题来了,二分查找需要将所有的东西组织到一个数组或者一棵树种,但是这都是要将所有信息全部放进内存才行啊。

就算我们有办法通过不断更新内存值来对外提供一个等价于外存大小的内存,但是这就是需要不断读取外存啊。

这不就是回到原点了吗?我们最开始要达到的目的不就是要减少读取外存块的次数吗!

这个时候我们就可以使用B树(我这里不区分B树或者B+树)来构建一种数据结构了。


如图所示B+树的每一层的一行中包含:①经过排序的字段的值②到介于两个字段值之间的更多字段的指针③叶子节点的指针是指向完整记录的指针

所以借助引用我们可以每次通过二分查找找到去到下一层的指针,所以每下降一层最多读取一次外存块。

所以查询是对数级。

当然用二搜索树这样做也能达到类似的效果。但是这里节点的子节点可以有若干,这样同样的节点数,树的高度更低。

毕竟树的高度就是读取外存的次数。而且B+树把叶子节点串起来,很有利于范围超找。


3.索引的优缺点

优点:

①本身索引字段值+指针值相对于单条完整记录值空间更小,所以同样一次读取外存块,能够访问的条目更多。

②将线性搜索线性复杂度借助于树的结构转变为N分查找的对数复杂度。

当然②相对于①要重要地多。

缺点:

①索引记录本身是需要存储空间的,如果你对很多字段分别建立索引,会消耗很多存储空间。

毕竟对于某些比较小的字段一个指针说不定比字段本身还大,结果就是某个字段的索引比某个字段还要打。


参考文献:

1.你知道数据库索引的工作原理吗?

2.《高性能MySQL》

3.《大规模分布式存储系统-原理解析与架构实战》


0 0
原创粉丝点击