mysql索引底层数据结构与算法

---恢复内容开始---

索引是什么

  索引是帮助MySql高效获取数据的排好序数据结构

  索引存储在文件里

索引结构

  推荐数据结构学习的网站:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html

  (二叉树、红黑树、BTREE、B+TREE、HASH)

  二叉树

    二叉树是n(n>=0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互不相交的、分别称为根结点的左子树和右子树组成。

    二叉树存储方式:

      以节点为基础,每新插入一个数据,则与父节点比较,若小于节点值则以节点为基础向左侧存储,反之向右,例如:

      

 

     二叉树缺点:如果数据为有序递增,那么存入的数据结构为右侧连续,则该根节点只有右孩子,没有左子树,(称为斜树)从而失去二叉树本身的特性:

      

 

 

  红黑树

    红黑树针对二叉树的斜树做了一定优化,在二叉树的基础上,如果出现“斜树”的情况,则会自动均衡,均衡规则依旧按照二叉树特性(中间数值为节点,左侧子节点小,右侧子节点大):

    

 

    红黑树的自动均衡,会使索引的存储结构更加优化,从而保证数据查询的效率

    注意:如果数据库表中存储的数据量过大,会导致红黑树的高度过高(不断往下扩展子节点),恰好要查询的目标数据在树结构的最低端,同样会比较消耗查询性能,

    可以发现:如果尽量降低树的高度,则会更大的提升查询效率,BTREE则针对此特点进行了优化

 

  BTREE(B树)

    从红黑树得知:每一个节点只会保存一个索引,而BTREE将每个节点的内存进行扩容,从而使每个节点可以保存更多的索引,从而降低树的高度,提升查询效率:

 

    可以发现:相比红黑树,BTree的两层结构保存了更多的节点

    BTree特点:

      叶节点具有相同的深度

      叶节点的指针为空

      叶节点的数据key从左到右递增排列    

    如上图(右)可看到:BTree的每个节点会同时保存索引(key)和此索引对应的值(data)

    so:如果可以减少每个索引的数据量,则减少每个索引的占用空间,从而在节点内存大小固定的情况下,每个节点可以保存更多的索引,会更进一步的降低树的高度(优化查询效率)

 

  B+TREE(B+树)

    B+Tree 相当于是BTree的变种,在BTree的基础上做了如下优化:

      非叶子节点不存储data,只存储key,非叶子节点之间保存了指针,指向下一级,最终指向保存data的最底层叶子节点

      叶子节点不存储指针

      顺序访问指针,提高区间访问的性能(叶子节点的key从左到右依次递增,通过访问指针,如果遇到范围查询时可直接通过叶子节点的指针找到下一个索引,而不需要重新从根节点进行搜索)

    Hash

      hash与树结构毫无关系,数据库如果使用hash的数据结构,则会将索引通过hash算法生成一个hash值保存在表中,并与此索引对应的文件指针直接对应,查询效率会很高

      但是大部分数据库的索引结构都用B+Tree,原因是hash结构只是在等号查询的时候效率很高,如果是其他查询(比如范围查询,则没有B+Tree如此高的效率)

 

 

---恢复内容结束---

posted on 2019-08-25 19:37  只为一人321  阅读(187)  评论(0编辑  收藏  举报

导航