Mysql 的索引底层原理及数据结构详解

Mysql 的索引底层原理

1.什么是索引?

   索引是一种排好序的数据结构,mysql目前默认使用的是b+树。

2.为什么使用b+树?

    例如表table 数据

 

id name
1 zs
2 ls
3 sa
4 zl
5 wmz
6 zs
7 sd


     这这个表里,没有加索引,要查询id= 6的数据,至少要查询6次,才能找到想要的那条数据  select * from table where id = 6;   

  1) 二叉树     

      最多只有两个叶子节点,也可以没有叶子节点 

    为什么不选用二叉树?

      根据二叉树的特点,如果是顺序的节点进行排列,则会形成链表的结构,此时查询跟没有使用索引是一样的效果,查询的次数过多,故不推荐使用。

      Mysql 的索引底层原理及数据结构详解_第1张图片

2) 红黑树

    这种树结构用的比较多,例如jdk1.8的hashmap中就是这树结构,但是mysql仍然没有采用这种树结构。

   平衡二叉树:即左右节点的长度超过2时,会自动旋转达到平衡的状态,旋转次数过多,效率较低。

   红黑树特点,节点不是红就是黑,从任一节点到叶子的节点包含的黑色节点数目都是相同的,旋转的次数较少,效率高,但是树的高度较高,因此查询的次数仍然较多。

    Mysql 的索引底层原理及数据结构详解_第2张图片

   3)hash

        这目前也是mysql官方保存的一种索引结构。

       hash索引主要是将该列进行hash计算之后指向一个地址,每次查询的时候,时间复杂度为O(1),查询效率非常高。但是由于生成的hash码是无规则的,所以不能进行排序操作,也不能进行范围查询,所以只适用于确定值的查询。

4)b+树

     官方推荐使用索引。

     b树:每个节点有多个叶子节点,根节点到每个叶子节点的长度相同,高度为m,叶子节点最多为m-1;且每个中间节点和叶子节点均有数据

      b树可以限制树的高度,从而达到查询次数较少目的。但是范围查询仍然需要进行遍历操作,所以对于范围的查询不太适用。

     Mysql 的索引底层原理及数据结构详解_第3张图片

     b+树:b+树的数据集中在叶子节点,并且索引是按顺序进行存放的,所以可以很快的进行范围的查询。

      Mysql 的索引底层原理及数据结构详解_第4张图片

3.mysql数据库的引擎

  1)myisam

      myisam引擎在本地生成三个文件,后缀分别为*.frm,*.MYI,*.MYD,   frm文件是创建的表结构,MYI是索引文件,MYD是数据文件

      不支持事务操作。

      非聚集索引:索引和数据没有绑定在一起

 2)innodb

      innodb引擎在本地生成两个文件,后缀分别为*.frm,*.ibd,  frm 文件是创建的表结构,ibd是文件包含了索引以及数据

     支持事务操作。

      聚集索引:索引和数据绑定在一起

4.使用自增的整型作为主键索引

    使用整型而不是uuid这种类型,因为在遍历比较的时候,整型比字符串类型速度更快

    使用自增长,能够更快的生成b+树,性能能够得到提升。

   

     

 

 

 

    

     

     

 

你可能感兴趣的:(MYSQL,mysql,数据库,索引,数据结构)