美文网首页
mysql索引浅析

mysql索引浅析

作者: 黑铁大魔王 | 来源:发表于2020-12-11 18:55 被阅读0次

    关键字

    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索引浅析

          本文链接:https://www.haomeiwen.com/subject/imqsgktx.html