MySql主要索引数据结构

索引数据结构

一、 二叉搜索树(Binary Search Tree)java

二叉搜索树是每一个节点最多有两个子节点的树,按照右侧子节点大于本节点,左侧子节点小于本节点的规律排列,能够用做搜索,结构以下图所示

image.png

二叉树虽然能够用于查找,但在某种特定状况下查找效率并不高,相似于下图:

image.png

二、红黑树mysql

对于二叉树的缺点,红黑树是一种拥有自平衡属性的二叉树,红黑树有五个特性:sql

  • 每一个结点是黑色或者红色。
  • 根结点是黑色。
  • 每一个叶子结点(NIL)是黑色。 [注意:这里叶子结点,是指为空(NIL或NULL)的叶子结点!不是有值的最后一个节点。]
  • 不能有两个相连的红色节点。
  • 每一个结点到叶子结点NIL所通过的黑色结点的个数同样的。

根据以上五种属性,红黑树生成时采用左旋,右旋,左右旋,右坐旋等才作,会生成出一颗相对平衡的二叉树,以下图
image.png数据库

三、Hash表数据结构

Hash表相似于java中的hashMap,把索引列作hash映射后以KV结构存储在内存中,是精准查找最快的索引结构,只须要一次hash即可以定位,但不支持范围查找。
就是个K-V结构,不画图了

四、B-Tree性能

因为数据库要存储大量的数据,若是采用二叉树进行查找,数据量过大时二叉树的层级过多,须要由上到下进行查找效率过慢,因此出现了B-Tree,BTree有以下特征
·叶节点具备相同的深度
·叶节点的指针为空
·全部索引元素不重复
·节点中的数据索引从左到右递增排列
数据结构直接上图

image.png

五、B+Tree优化

不过mysql真正采用的不是BTree,Btree在作索引的时候有些地方并非很实用,最终优化出了B+tree做为mysql innoDB存储类型的索引,B+tree的特征以下spa

  • 非叶子节点不存储data,只存储索引(冗余)
  • 能够放更多的索引
  • 叶子节点包含全部索引字段
  • 叶子节点用指针链接,提升区间访问的性能

结构以下图3d

image.png

PS:innoDB中的主键索引的B+tree是汇集索引,叶子结点直接存储的其余字段的值,用于减小IO的次数,而辅助索引的叶子结点则是存储的主键的值,用于辅助查找

mysql主要索引类型

1:MyISAM存储引擎索引实指针

MyISAM的索引和数据文件是分开的(非汇集索引),索引的叶子节点存储的是数据的物理地址,查找到相关索引后再用索引去硬盘上查找数据
image.png

2:InnoDB存储引擎索引实现

InnoDB的索引是和数据存储在一块儿的(汇集索引),叶子结点中存储了全部其余字段的值,只须要一次加载叶子结点的IO进行索引匹配,匹配成功后不须要再次进行IO操做读取对应的数据
--表数据文件自己就是按B+Tree组织的一个索引结构文件
--非主键索引结构叶子节点存储主键值的缘由是为了一致性和节省存储空间
image.png

3: 联合索引的底层存储结构

联合索引是根据索引创建时字段的排列顺序创建的索引,后续索引是对第一个字段索引的再划分,差找时若是不能保证按照索引简历时的顺序进行查询,则联合索引失效
image.png
相关文章
相关标签/搜索