关键字
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次数,降低查询效率。
图002PS: 注意,这里并不是将新插入的数据存入第二页,而是根据主键索引值进行排序,有可能将第一页的数据转移到第二页,新增加的数据插入第一页的适当位置。
举个例子,如果插入的数据是5_d,那么10_d的数据会进入第二页,而5_d则会被保存在第一页4_d的后面
解决方案是建立索引页,用于保存页001,页002的排序信息,如图002所示查询数据时先通过索引页来决定查询哪个页,再进入对应的页查询数据
举个例子:
查询18_d,先通过索引页定位到18>11,所以进入页002查询。
B+树
随着页数量的增加,页与页之间会有更多的索引页被建立,这是,就需要为索引页建立索引页来提高查询效率。如图所示
这时,b+树就产生了。如下图003所示
图003
网友评论