数据库索引

一、首先了解下为毛数据库必须有主键

我们都知道在数据存储在数据库中,对于关系型数据库来说,我们看到的表是【行*列】的格式。那么这些表中的数据是怎么存储在磁盘上的呢?

如果不设置主键,那么按照操作系统中所讲,是分页般的存储,一行一行的排列下去。

但如果设置了主键,则不然。

设置了主键以后,数据库在磁盘中的存储变成平衡树的结构,平衡树就挺多的了,目前了解到的是以B+树或B树的形式。

二、进入索引

如果设置了主键,变成了平衡树,那么该表就成了索引,称之为聚集索引。

熟悉平衡树的仔仔们都知道,平衡树的复杂度跟一条一条去遍历的复杂度之间的差距吧。如果一条条的去遍历,最坏的情况下是O(n),而平衡树的复杂度则是,咳咳,log的以树的分支为底,以结点数为what?来着(数学老师要打我)log+底为树的分支数,+上面的值记录的总数。

孰快孰慢一目了然。

三、其他类型的索引

非聚集索引:聚集索引是以整张表,那么非聚集索引则是以某些字段。

                     可以为数据库中的所有字段建立个索引,生成非聚集索引。如果建立了,则用脚趾头也知道,多么的耗费存储空间。于是乎,可以建那么几个就行。

覆盖索引:聚集索引是一个平衡树,而树中的非叶子节点则是存储着真实的数据,所以想要通过非聚集索引获取真实数据的是必须要经历聚集索引的。从此话中可以看出,想要获取数据,好像至少是要经历聚集索引的,那么还经历what呢?关于什么是覆盖索引,看下面。

四、通过索引获取数据的过程

通过非聚集索引查询:如果查询条件是某几个字段的话,先通过该几个字段的非聚集索引找到该数据的主键,再去聚集索引中通过主键来定位到结点的位置,再去叶子节点中找到该主键对应的数据。

通过覆盖索引查询:上面提到非聚集索引是为想要使用的每个字段建立索引,而覆盖索引的话,可以为几个字段建立索引,这样就成了覆盖索引。就是通过字段a来查询,不用获取其主键值再跑到聚集索引中了,而是直接在覆盖索引中找到叶节点主键以后,字段b也在该叶节点中,所以直接获取即可。

举例:

create index,birth on user(birthday);

create index,birth_and_name on user(birthday,username)

 

posted @ 2019-09-25 17:09  大野酱  阅读(1158)  评论(0编辑  收藏  举报