MySQL索引链表_mysql索引浅析

关键字

mysql

索引

innodb

B+树

mysql的innodb存储引擎是如何保存数据的

innodb引擎需要有主键,即使建表是不去建立主键,mysql也会默认的为表生成一个隐藏主键

上一篇说到数据的分页存储,具体是如何分页的呢?

【主键+数据】以链表的结构,顺序存储,这样在插入新数据时,效率会很高。但是查找时,需要从头遍历链表。

一页

当一页的数据量很大,并且查询的数据在链表末尾时,就需要便利整个链表,效率将会降低。

于是,通过对链表进行分组,将链表“切割”成多个小段。查询数据时,先查询数据所属于的组,

再遍历查询该组对应的链表数据区间。可以提高查询效率。

图001

举个例子:

假设一页存储8条数据,如图001

当没有组的时候,查询主键为10的数据,需要遍历链表,比较8次数据,最后得到所以为10的数据在链表第8个位置,返回结果。

建立了组之后,组里面保存了每个链表区间的最大主键索引值,那么先去组里寻找被查询数据所在的组,10>7,那么就直接去7这个组所对应的链表区间里,从7_d开始向下遍历,只需要做4次比较,即可返回结果。

索引页

第一页存储了8条数据,继续增加数据的话,会新增加一页储数据,那么这时会出现2页,该如何查询数据呢?如果先去页001查询,查询不到数据再去页002查询,那么将会增加磁盘io次数,降低查询效率。

PS: 注意,这里并不是将新插入的数据存入第二页,而是根据主键索引值进行排序,有可能将第一页的数据转移到第二页,新增加的数据插入第一页的适当位置。

举个例子,如果插入的数据是5_d,那么10_d的数据会进入第二页,而5_d则会被保存在第一页4_d的后面

图002

解决方案是建立索引页,用于保存页001,页002的排序信息,如图002所示查询数据时先通过索引页来决定查询哪个页,再进入对应的页查询数据

举个例子:

查询18_d,先通过索引页定位到18>11,所以进入页002查询。

B+树

随着页数量的增加,页与页之间会有更多的索引页被建立,这是,就需要为索引页建立索引页来提高查询效率。如图所示

这时,b+树就产生了。如下图003所示

图003

你可能感兴趣的:(MySQL索引链表)