Mysql索引底层数据结构

想要了解索引,首先要知道索引到底是什么呢
*索引是帮助MySQL高效获取数据的排好序的数据结构;通俗来讲就好比喻一本书,那这本书的目录就好比做索引;
*索引存储在文件里(存储引擎是MyISAM的索引文件存储在 *.MYI文件中,存储引擎是InnoDB的索引文件存储在 *.idb文件中)
在这里插入图片描述
通常数据库中的数据就是存在硬盘上的,表存磁盘文件,没有索引就得一行一行扫描文件,每一行得记录在文件里不一定连续的,如果要找到指定的数据或许很耗时间,如下图如果查询Col1等于7的数据就会很耗时间的。
在这里插入图片描述
在这简单说一下磁盘的存储原理
在这里插入图片描述
寻道时间(速度慢,费时)
旋转时间(速度较快)
数据就是存储在扇区中的磁道中,与主存不同,磁盘i/o存在机械运动耗费,因此.因此磁盘10的时间消耗是巨大的。传入文件地址,即确定要读的数据在哪个磁道。哪个扇区。为了读取这个扇区的数据,需要将磁头放到这个房风上大’ 为了实现这一点,磁头需要移动对准相应磁道,这个过程叫做目治 然后磁盘旋转将目标扇区旋转到碰头下,这个过程耗费的时间。这个过程耗费的时间叫做旋转时间。

索引的结构

1.二叉树

(会单边增长,深度较大)
在这里插入图片描述

2.红黑树

(会自动平衡,但深度还是不可控制的)
在这里插入图片描述

3.HASH

(通过hash算法,把某个索引换算为hash值作为磁盘存储这条数据的地址,正常查询只需要通过一次hash计算就能获取值,但hash没有查询范围的值,如id>1就不能查询了)
MySQL中也有hash的索引存储方式,不过不常用
在这里插入图片描述

4.B-tree

。度(Degree)-节点数据存储的个数
。叶节点具有相同的深度
。叶节点的指针为空
。叶节点的数据key从左到右递增排列

在这里插入图片描述

5.B+tree(B-tree的变种,mysql就是用了这种结构索引)

。非叶子节点不存储data,只存储key,这样子增加度,度增加,树的深度随之减少
。叶子节点不存储指针
。顺序访问指针,提高区间的访问性能。如要查询>30的数据,如果30和49之间没有指针要这样区间查询性能会减低很多,如果有指针指着,这样子查询只要查指针就可以了

在这里插入图片描述

B+Tree索引的性能分析

。 一般使用磁盘I/0次数评价索引结构的优劣
。预读:磁盘一般会顺序向后读取一定长度的数据(页的整数倍)放入内。存局部性原理:当一个数据被用到时,其附近的数据也通常会马上被使用
。B+Tree节点的大小设为等于一个页,每次新建节点直接申请-一个页的空间,这样就保证一个节点物理上也存储在一个页里,就实现了一个节点的载入只需-一次I/0
。B+Tree的度一般会超过100,因此h非常小(一般为3到5之间)

存储引擎是作用在表级别的

MyISAM索引的实现(非聚集)

。MyISAM索引文件和数据文件是分离的
在这里插入图片描述
MyISAM的主键索引
在这里插入图片描述
MyISAM的非主键索引(和主键索引没什么区别)
在这里插入图片描述
MyISAM存储引擎,索引查询先先通过索引查询到叶子节点下data(文件指针),然后通过文件指针定位到保存的数据

InnoDB索引实现(聚集)

。数据文件就是索引文件(数据和索引两者文件是合并在一起的 *.idb)
在这里插入图片描述
InnoDB的主键索引
在这里插入图片描述
InnoDB非主键索引
在这里插入图片描述
两者又很大的差别
。表数据文件本身就是索引文件
。表数据本身就是按B+tree组织的一个索引结构文件
。聚集索引-叶节点包含完整的数据记录
。为什么InnoDB表必须包含主键,并且推荐使用整形的自增主键
*因为InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有), 如果没有 显式指定,则MySQL系统会自动选择一个可以唯一 标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为InnoDB表生成一一个隐含字段作为主键,这个字段长度为6个字节,类型为长整形。InnoDB的辅助索data域存储相应记录主键的值而不是地址,便于维护与数据一致性索引如果是字符串以ASCII码作为比较准则
*为什么不建议使用过长的字段作为主键,因为所有辅助索引都引用主索引,过长的主索引|会令辅助索引|变得过大。再例如,用非单调的字段作为主键在InnoDB中不是个好主意,因为InnoDB数据文件本身是一颗B+Tree,非单调的主键会造成在插入新记录时数据文件为了维持B + Tree的特性而频繁的分裂调整,甚至有的目标页面可能已经被回写到磁盘上而从缓存中清掉,此时又要从磁盘上读回来,这增加了很多开销,同时活致的放频繁的移动、分页操作造成了大量的碎片,得到了不够紧凑的索引结构,十分低效,而使用自增字段作为主键则是一个很好的选择。
。为什么非主键的索引结构叶子节点存储的是主键值
*因为为了一致性和节省存储空间,因为如果要插入数据的时候不仅会要维护主键索引,还要维护二级索引,如果在非主键索引中也存储数据,就得保持数据的一致性,如果还有分布式呢,这样子就大大增加了维护索引的力度。

联合存储索引底层存储结构

在这里插入图片描述
它是把所有的索引都存在同一个节点中,查询的时候先查第一个索引,如果找到了就不需要继续下去,如果有多个相同的(10001)就继续查第二索引(Assistant),如果还是一样就继续招下面的索引。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值