深入理解Mysql索引底层数据结构

  1. 索引的概念:

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

  2. 索引存储在文件里:

    mysql主要有两种存储引擎: Myisam、Innodb两种

    对于存储引擎为Myisam的数据表中,有三种文件格式,以.frm为后缀的表结构文件、以MYD为后缀的数据文件,以MYI为后缀的索引文件;

    对于存储引擎为Innodb的数据表中,有两种文件格式,以.frm为后缀的表结构文件、以ibd为后缀的索引与数据合并的文件

     

深入理解Mysql索引底层数据结构

    myisam索引实现: 非聚集索引(索引文件和数据文件是分离的)

    Innodb索引(聚集索引)

二、索引的各种存储结构及其优缺点

   在开始讲这一小节之前,我们先来看一下在数据库没有加索引的情况下,SQL中的where字句是如何查找目标记录的。

   我们先看下左边表格第二列Col2列的数据时如何查找的,如果我们希望查找where Col2 = 22的记录,我们在没加索引的情况下是按顺序从第一条记录查找,由此可知需要查找5次才能找到;

      如果对Col2字段加上索引后,我们假设使用最简单的二叉树作为索引存储方式,再次查找where Col2 = 22的记录这次只需要查找2次就能找到目标记录,效率提高十分明显。

        

深入理解Mysql索引底层数据结构

深入理解Mysql索引底层数据结构

   1. 二叉树

    二叉树是一种比顺序结构更加高效的查找目标元素的结构,它可以从第一个父节点开始跟目标元素值比较,如果相等则返回当前节点,如果目标元素小于当前节点,则移动到左侧子节点进行比较,

     大于的情况则移动到右侧子节点进行比较,反复进行操作最终移动到目标元素节点的位置

    

深入理解Mysql索引底层数据结构

    二叉树缺点:

      在大部分情况下,我们设计索引时,都会在表中提供一个自增索引字段作为建立索引的列,这种情况下所有的只能增节点都会添加到上一节点的右侧,

      这种情况下查询节点时跟没有添加索引的情况是一样的。

      

深入理解Mysql索引底层数据结构

  2. 红黑树

    红黑树也叫平衡二叉树,它继承了平衡二叉树的优点,同时也解决了上面二叉树自增整形索引的问题,从下面的动态图可以看出红黑树会不断对树结构进行调整 

    

深入理解Mysql索引底层数据结构

    红黑树的缺点:

      在数据量大的时候,树的高度也很大,从图中可以看出每个节点只能有两个子节点,所以红黑树的高度会达到几十以上,增加了磁盘的I/O,降低了查找的效率。

  3. HASH  

    对数据进行Hash散列运算,通过Hash算法计算hash值,再根据hash值从索引文件中获取文件在磁盘的位置并读取,快速定位目标记录,查询效率高。

    缺点:

      无法解决范围查询的场景、也不支持模糊查询。

    4. B-Tree

    既然红黑树存在缺点,那么我们可以在红黑树的基础之上构造一种新的存储结构,解决思路:因为树的高度太大,就只需要适当的增加每个树节点可以存储的数据个数即可,

    但是数据个数也需要有一个阈值,否则会导致一个节点的数据过多导致其他的问题。

    先来了解一下B-Tree的知识点

      度(degree)-节点的数据存储个数,每个树节点中数据的个数大于15/16 * degree时会自动分裂,调整结构。

      叶节点具有相同的深度

      叶子节点的指针为空

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

    

    1. 树节点结构:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzddwp.html