数据库索引与b+树

数据库索引详解

索引

当咱们在设计数据库的时候,对表的一些属性有时会加上索引,但索引为何能提升检索速率呢?是否是用了索引就必定能够提升效率呢?不一样索引之间有什么区别呢?搞懂这些问题是灵活运用索引的必备条件。接下来,咱们将一 一进行讨论。数据库

一.索引的本质

索引也分为不一样的种类,并且也有不一样的分类方法,比较经常使用的是普通索引和汇集索引。缓存

1.普通索引

其实对某字段创建了索引就至关因而对该字段新创建了一个表,这个表里的元素是安照这个字段有序排列。这样有什么好处呢?好处就在于若是咱们select的时候要搜索该字段,那就会在这个索引表中先查找,由于索引表是有序的,因此在检索该字段的时候就是二分搜索,速度天然会比在原表上快,而后若是我只须要这一个字段的话,查询就能够结束了,但若是还须要除索引字段的其余字段的话,那么就会根据这个索引表的字段对应到主表中,而后再获取。
看了上面讲的,是否是感受有点迷茫?下面看一下图就会清晰不少。

(图片来源于百度)
你们能够看到这里咱们以Col2创建索引以后右边有一颗二叉树,可能你们会问不是说好了是一张表吗,怎么又是二叉树了,好吧表自己就是一种树形的数据结构存储,虽然实际上不多会选取二叉树,但此处方便讲解。能够看到Col2单独的一棵树,而后每个节点对过来是一条记录,若是咱们执行 select Col2 from tablename where Col2=34;那么直接在右边的树中二叉搜索,找到了就能够返回了。若是咱们执行 select * from tablename where Col2=34;那么能够看到须要的不只仅是Col2这一个字段,那么仍是先在二叉树中查找,而后找到了以后对应到主表中,而后返回整条记录。数据结构

1.索引的数据结构

经过上面的图咱们能够看到,索引的本质其实就是新建了一张表,而表本质上的数据结构就是树形结构,因此索引也是树形结构。但实际运用中并无谁用红黑树,avl树这种数据结构,通常是b+树,接下来给你们大体介绍一下b+树的构成。

(图片来源于百度)
b+树在构建时和咱们以前提到的二三树很像,只是有一些改进,b+树的非叶子节点不包含value的信息,也就是说非叶子结点只起到一个导航的做用,全部的value放在了叶子结点里,这样因为B+树在内部节点上不包含数据信息,所以在内存页中可以存放更多的key。 数据存放的更加紧密,具备更好的空间局部性。所以访问叶子节点上关联的数据也具备更好的缓存命中率。一般会将b+树进行优化,增长顺序访问指针。

(图片来源于百度0)
在B+Tree的每一个叶子节点增长一个指向相邻叶子节点的指针,就造成了带有顺序访问指针的B+Tree。作这个优化的目的是为了提升区间访问的性能,例如图中若是要查询key为从18到49的全部数据记录,当找到18后,只需顺着节点和指针顺序遍历就能够一次性访问到全部数据节点,极大提到了区间查询效率。
能够看到b+树对于表的存储是一种很方便的数据结构。那么为何不用红黑树呢,由于数据量大的时候,会致使这种二叉树深度太深,io次数会不少,层数不多的b+树能够有效下降io次数。性能

汇集索引

汇集索引和普通索引是不同的,汇集索引是指数据库表行中数据的物理顺序与键值的逻辑(索引)顺序相同。一个表只能有一个汇集索引,由于一个表的物理顺序只有一种状况。意思就是说上面的普通索引咱们能够看到是另建了一个表,而后当查询到了索引没有覆盖到的字段的时候是将这个字段映射到了主表中而后进行查询的。而汇集索引创建后主表自己就会按照这个索引的结构来存储,意思就是说主表直接就按这个来存了。这也是为何汇集索引必定是惟一的缘由,由于一张表中只能有一种存储方式。优化

汇集索引与普通索引

两种索引谁更快呢?这固然是没有悬念的,汇集索引更快咯,由于普通索引查到没有覆盖的字段的时候须要向主表中映射过去,而后再获取,而汇集索引由于其自己就包含了全部数据,因此一次就好~设计

主键与汇集索引

在咱们新建一个表时,若是没有定义主键,那么表格的数据是顺序线性存储的,在定义的主键以后,由于主键默认有索引,而且在不少平台上默认是汇集索引,因此在主键定义的时候就会把整个表变为一个树形结构(若是主键是汇集索引),但要知道的是主键不必定是汇集索引,也能够是普通索引,只是不少平台默认为汇集,不要盲目划等号。指针

索引的利弊

那么索引既然这么快是否是越多越好呢?不存在的,由于索引自己是一个数据表,那么在插入或删除的时候就涉及到了索引表的改变,b+树的插入删除涉及到不少节点操做,或许会消耗不少时间。因此咱们对于常改变的字段不宜建索引,而对于改动较少的字段就很合适,在设计表的时候咱们要灵活选取,才能高效。blog

相关文章
相关标签/搜索