MySQL底层数据结构与算法-01

MySQL底层数据结构与算法

一、索引数据结构

1、什么是索引

索引就是一种数据结构(排好序的数据结构),能帮助我们高效的获取数据,例如目录

慢查询:在数据库当中执行时间较长的SQL语句,也称之为慢SQL

创建索引的目的:为了减少磁盘I/O的次数,加快查询效率

2、索引数据结构

具备充当索引的数据结构有以下几种:二叉树、红黑树、hash表、B树(B+树)。

而我们数据库最终使用的是B+树(B+树的改进,叶子节点间添加了双向指针,便于范围查找)。

数据结构可视化网站:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html

  • 二叉树

在这里插入图片描述

二叉树对于单边增长就是链表

二叉树特点是每个节点最多只能有两棵子树,且有左右之分。如果是顺序的插入数据,二叉树会退化成链表,那么查找其中的元素的时候,就会需要整体的遍历,显然不适合作为数据库的索引。

  • 红黑树(二叉平衡)

在这里插入图片描述

HashMap 早期的表现形式为动态数组加链表,现在为红黑树

缺点:树的查找都是由跟节点往下查找,高度不可控制

性能影响查找的次数与高度相关

红黑树是一种平衡的二叉树。添加节点的时候,相比二叉树,节点间会进行自动的平衡,不会退化成链表,可以有效降低树的高度。但是红黑树本质还是二叉树,对于数据库来说,避免不了在数据量大的情况下,树的高度依然非常高的情况。

  • Hash

    在这里插入图片描述

    对索引的key进行一次Hash计算就可以定位出数据存储的位置,查找效率非常高。

    但是Mysql数据库不使用Hash表进行索引存储,原因:

    1. Hash表只能满足精确查找 “=”,不支持大于,小于等范围查询,范围查询需要全表扫描
    2. 存在Hash冲突问题
  • B-Tree

    在这里插入图片描述

    B树是一棵平衡的m路搜索树,它的子节点可以有多个,使得整颗树更加的扁平化。所有节点关键字是按递增次序排列,并遵循左小右大原则。B树(B+树)一般较多用在存储系统上,比如数据库或文件系统。

  • B+Tree
    在这里插入图片描述

B+树是B树的一个升级版,相对于B树来说B+树更充分的利用了节点的空间,让查询速度更加稳定,其速度完全接近于二分法查找。

1、B+树的非叶子节点不保存关键字记录的指针,只进行数据索引,这样使得B+树每个非叶子节点所能保存 的关键字大大增加
2、B+树叶子节点的关键字从小到大有序排列,左边结尾数据都会保存右边节点开始数据的指针,方便范围查 找

问题

MySQL为什么选择B+Tree而不选择B-Tree

1、B+Tree的中间节点只用来索引,所以对于相同的空间B+Tree里面存储的关键字更多,B+Tree相对就更加矮 胖一些,所以磁盘IO的次数就少一些。
2、由于B-Tree的中间节点也存储数据,所以它的查询效率不是很稳定,最好的情况是在根节点就直接查询到数据了,而最差的情况是下叶子节点才能找到数据。而B+Tree不管什么时候都必须要到叶子节点才能获得数据,这是因为B+Tree里面非叶子节点不存储数据只是用来索引。

  • 由于B-Tree的中间节点也存储数据,所以它的查询效率不是很稳定,最好的情况是在根节点就直接查询到数据了,而最差的情况是下叶子节点才能找到数据。而B+Tree不管什么时候都必须要到叶子节点才能获得数据,这是因为B+Tree里面非叶子节点不存储数据只是用来索引。
3、MySQL存储引擎

​ 存储引擎对于数据库表级别生效

InnoDBMyISAM(MyISAM存储方式里面,索引和数据是分开存储的)

InnoDB VS MyISAM

  • InnoDB:聚簇索引(索引组织表中数据也是索引的一部分)
  • MyISAM:非聚簇索引(索引文件和数据文件是分离的,查找数据需要进行回表)
  • 文件结构:frm格式文件同为表结构,但是MyISAM有MYD(数据)、MYI(索引)分别存储,InnoDB只有ibd文件存储索引和数据
  • 联合索引:联合索引会根据字段定义的顺序排序,所以使用联合索引也需要严格遵循字段定义的顺序

有MYD(数据)、MYI(索引)分别存储,InnoDB只有ibd文件存储索引和数据

  • 联合索引:联合索引会根据字段定义的顺序排序,所以使用联合索引也需要严格遵循字段定义的顺序
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值