MySQL索引的数据结构、存储引擎

1.什么是索引

(1)索引是帮助MySQL高效获取数据的排好序的数据结构

(2)索引其实相当于一本字典的目录,它可以帮助我们快熟查找到我们想要内容,因此,索引其实是要占据一定空间的

(3)索引是针对表而建立的

(4)索引在增加了查询效率的同时,会增加表的维护成本

2.索引的数据结构

实现索引的数据结构:二叉树、红黑树、Hash表、B树、B+树

最开始的索引使用的是二叉树,但是当数据量大的时候,二叉树的高度可能会很高,这样的话就会降低查询的效率。后来的话又使用了红黑树,因为红黑树会对表的高度做一个维护,让表的高度不会太高,增加了查询的效率,但是红黑树本质上也是二叉树,所以它的效率其实也是不太高。后来就发展出了B树和B+树

1.B树

B树其实就是一个平衡的多叉树

在分配空间的时候,在每一个节点放更多的索引元素,这样树的高度就会降低很多,查询效率也会增加,但是最终使用的是B+树
在这里插入图片描述
来自诸葛老师视频里的图

data存储的是索引所在行的磁盘文件地址

2.B+树

B+树其实是对B树的优化,B+树和B树最大的不同就是,在B+树的非叶子节点上不存储数据,而是把数据统一放到叶子节点上,而且叶子节点之间是用指针相互连接的

非叶子节点是将子节点的第一个数据提上去做冗余数据来构造这棵B+树。(例如15,20,49这三个节点)

MySQL底层对每一个节点分配的大小是16kb(可以改变,但不推荐)

查找元素的方式:会从根节点开始,将根节点的元素加载到内存(RAM)里面,采用二分查找的方式,找到一个范围,再把这个范围的磁盘文件地址加载到内存,继续采用二分查找的方式,直到找到叶子节点,再把叶子节点的磁盘文件空间加载到内存中,再在内存中查找到某个元素

MySQL查询慢的主要原因就是从磁盘加载到内存的这个过程,也就是磁盘I/O,而在内存中查找数据是非常快的。所以在MySQL更高版本的话,B+树的非叶子节点在MySQL初始化的时候会先加载到内存,这样整个查找过程只需要一次磁盘I/O,速度大大增加
在这里插入图片描述

3.Hash表

Hash索引的查询速度更快,但是不支持范围查询。(一般不推荐使用)
而B+树的叶子节点之间是用指针连接的,提高了范围查找的性能
在这里插入图片描述

3.MySQL数据库的索引存储引擎

1.MyISAM

MyISAM的索引文件和数据文件是分开的,也就是存在两个文件(非聚集索引)
索引文件存在 .MYI(MYISAM Index)文件中
数据文件存在 .MYD(MYISAM Data)文件中
表的结构存在 .frm (frame)文件中
在这里插入图片描述
MYISAM查找数据:
例如select * from t where t.col1 = 30
MySQL底层会先判断 col1 是不是索引字段,如果不是的话,会进行全表扫描,如果是索引字段,会先在 .MSI 文件中通过二分查找法得到一个索引所在行的磁盘文件地址 0xF3 ,再到 .MSD 文件中快速定位到查找行的位置并取出
在这里插入图片描述

3.InnoDB

InnoDB表的数据文件本身就是按B+树组织的一个索引文件,也就是索引和数据放在一起(聚集索引)
在这里插入图片描述
主键索引和数据放在一棵索引树上面
聚集索引查询比非聚集快:由于聚集索引的数据和索引放在同一个位置,也就是查找到相应位置之后就可以直接把数据拿出来,而非聚集索引的索引结构和数据存放在两个不同的文件,当我们要查找某个元素时,非聚集索引会在找到索引之后,再到另外一个文件去查找,类似于进行了一次回表操作,比较耗时

非主键索引:如下图,非主键索引会再开一棵B+树,而它的叶子节点存储的data数据是索引所在行数据的主键,而要通过非主键索引查找数据的话,会先查找到它的主键,再去主键索引里查找相应的数据,也做了一次类似于一次回表
在这里插入图片描述
(1)为什么建议InnoDB表必须建立主键,并且推荐使用整型的自增主键?
因为InnoDB是主键索引的叶子节点存储数据,如果不建主键索引的话,MySQL底层会在每一列中寻找一列可以建唯一索引的列,用来组织这棵B+树,存储整张表的所有数据,若是没有符合要求的列,MySQL会在后台多维护一列数据RowId,然后用RowId组织这棵B+树结构,这样的话会浪费MySQL的性能以及浪费磁盘空间;
使用整型的自增主键是因为整型相对于其他数据类型,在比大小的时候会更快,查找的时候也就更快。自增的话,当我们增加数据的时候,B+树为了保证顺序,会去维护这棵树的结构,而自增会减少树分裂的次数,会让MySQL更好的去维护这棵树,效率更高。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值