首页 > 数据库 >MySQL专题面试题-二叉树、红黑树、B 树、B+树

MySQL专题面试题-二叉树、红黑树、B 树、B+树

时间:2023-10-08 14:58:31浏览次数:55  
标签:面试题 目录 插入 键值 二叉树 红黑树 数据 节点

演示网址:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html

所谓的索引,就是帮助MySQL高效获取数据的排好序的数据结构,基本都是按照k-v形式存储。

1.二叉树

 二叉树的每个节点至多只有2个叶子节点,且左边的叶子节点键值比根节点小,右边的叶子节点键值比根节点大。这些节点上都存储的索引值k,而v就是这条数据在磁盘上的首地址。下图是一棵普通的二叉树,插入的顺序是:5,3,4,2,6,7.

可以看出,当不断的插入比根节点大的值时,就会一直往右边节点添加。如果是自增的,那么右边的树深度就会高,查询效果不佳。

 

2.红黑树

 红黑树是一种特殊的平衡二叉树,就是让节点分为红色和黑色两种,其中根节点为黑色,其插入效果如下,数据顺序还是:5,3,4,2,6,7.

 

可以看出,在插入时,会进行节点的旋转,以至于让其满足规则。即插入的节点键值处于当前两个节点中间时,会变化位置,以符合二叉树的规范。可想而知,这种方式在插入时,频繁的变换位置,也会影响插入效率。

3.B 树

 B树也是二叉树的一种优化,但不同的是,其一个节点上可以有多个键值。其插入效果如下,数据顺序还是:5,3,4,2,6,7.

无论怎么变化,这种树都遵循二叉树的原则,也就是这些节点都是排好序的,根节点的左边节点键值比其小,右边节点键值比其大。 即使一个节点上有多个键值,也是有顺序的。

4.B+树

 B+树是对B树的一种升级,区别在于在叶子节点上都有指针进行关联,而且叶子节点上也冗余存储了非叶子节点的数据。其插入效果如下,数据顺序还是:5,3,4,2,6,7.

那么在mysql的官方文档中,指出了叶子节点之间双向指针。而其最小的单位是page(页),一页是16KB(包含了页头,也目录和用户数据),数据都按照16KB的方式存到磁盘中,在查询时也是一次取出一页的数据进行判断。在数据插入时,会按照主键索引进行排序存储,上述的动态图已经很好的说明了这一点。排好序后,是非常便于查询的,当不符合条件时即可提前结束查询直接返回结果,而不至于扫描全表。但是对于其指针的特性,也是有缺陷的,如果要查询某一数据,必须按节点的先后顺序遍历很多次,因为链表插入的效率高,查询的效率低。那么此时页目录就派上用场了。页目录类似书籍的目录,对用户数据进行分组,其中目录项存储的是用户数据的起始项,结构如下图所示,左图是当只有一页时的场景,而右图是有多页时的场景。当然,又多页时,又变成了一个链表,此时就可以按照页目录的方式,对这些页再创建一个目录用来存储下面这些页目录的起始节点,而这个目录就是根节点。

                       

 那么在查询时,就可以先把页目录的数据拿出来进行比较,获取对应的组后再去用户数据区域遍历数据,减少了遍历的次数,提高了查询的效率,实际上是空间换时间的思想。

标签:面试题,目录,插入,键值,二叉树,红黑树,数据,节点
From: https://www.cnblogs.com/zys2019/p/17732873.html

相关文章

  • 企业场景面试题
    面试时,在询问一些技术场景问题的时候,通常以如下的问题。这些是每一个项目都需要面对的问题,能够回答这些问题才能够说明有过实际的开发经验,同时从回答种也可以看出我们的真实实力水平......
  • 医院设置(二叉树)
    https://www.luogu.com.cn/problem/P1364这道题是个二叉树(为什么有人要去用dfs,bfs去做??(▔___▔))题目描述这道题让我们在这棵树上修建一家医院,而且让人们到医院的距离和最短,距离和也就是每一个点到医院的距离*这个点上有的人数(就这么简单)首先我们可以建一个结构体,里面存了每一个点......
  • 常见面试题3
    三接口和抽象类有什么共同点和区别?共同点:•都不能被实例化。•都可以包含抽象方法。•都可以有默认实现的方法(Java8可以用default关键字在接口中定义默认方法)。区别:•接口主要用于对类的行为进行约束,你实现了某个接口就具有了对应的行为。抽象类主要用于代码复用......
  • 常见面试题2
    二什么是多态多态,顾名思义,表示一个对象具有多种的状态,具体表现为父类的引用指向子类的实例。`多态的特点:•对象类型和引用类型之间具有继承(类)/实现(接口)的关系;•引用类型变量发出的方法调用的到底是哪个类中的方法,必须在程序运行期间才能确定;•多态不能调用“只在子类存......
  • 常见面试题5
    六char和varchar的区别是什么?1.char类型的长度是固定的,varchar的长度是可变的。这就表示,存储字符串'abc',使用char(10),表示存储的字符将占10个字节(包括7个空字符)使用varchar(10),则表示只占3个字节,10是最大值,当存储的字符小于10时,按照实际的长度存储。2.char类型的效率比varch......
  • 常见面试题4
    四为什么重写equals()时必须重写hashCode()方法?因为两个相等的对象的hashCode值必须是相等。也就是说如果equals方法判断两个对象是相等的,那这两个对象的hashCode值也要相等。如果重写equals()时没有重写hashCode()方法的话就可能会导致equals方法判断是相等的......
  • 常见面试题7
     cookie和session的区别?1.存储位置不同cookie的数据信息存放在客户端浏览器上。session的数据信息存放在服务器上。2.存储容量不同单个cookie保存的数据<=4KB,一个站点最多保存20个Cookie。对于session来说并没有上限,但出于对服务器端的性能考虑,session内不要存放过多的......
  • 常见面试题6
    Java集合框架Java容器分为Collection和Map两大类,Collection集合的子接口有Set、List、Queue三种子接口。我们比较常用的是Set、List,Map接口不是collection的子接口。Collection集合主要有List和Set两大接口•List:一个有序(元素存入集合的顺序和取出的顺序一致)容器,元素可以......
  • 常见面试题1
    一、==和equals的区别==对于基本类型和引用类型的作用效果是不同的:•对于基本数据类型来说,==比较的是值。•对于引用数据类型来说,==比较的是对象的内存地址。因为Java只有值传递,所以,对于==来说,不管是比较基本数据类型,还是引用数据类型的变量,其本质比较的都是值,只是引......
  • 【TinyWebServer】13踩坑和面试题
    踩坑在此项目中遇到的一些比较有意义的问题大文件传输先看下游双书上发送逻辑这块的代码,发送数据只调用了writev函数,并对其返回值是否异常做了处理。boolhttp_conn::write(){ inttemp=0; intbyte_have_send=0; intbyte_to_send=m_write_idx; if(byte_to_......