title: 常见面试题:为什么MySQL索引要用B+Tree呢?(看完你就能和面试官笑谈人生了)
tags: 面试常见题


常见面试题:为什么MySQL索引要用B+Tree呢?(看完你就能和面试官笑谈人生了)

为什么MySQL索引要用B+Tree呢?

要跟面试官回答该问题,就需要先跟面试官讲讲能够作为MySQL索引的结果有哪些。

参考文章:为什么 MySQL索引要用 B+tree

以下就是我的回答:

我们知道,索引的常用结构有:二叉树、红黑树、Hash表、B-Tree、B+Tree 这几种。

1)为什么不采用二叉树呢:

原因:因为假设此刻用普通二叉树记录id系列,我们在每插入一行记录的同时还要维护二叉树索引字段。如果此时找id = 7这一行记录需要找7次,这跟扫描全表也没有什么大的区别。显而易见,二叉树对于这种依次递增的数据列,其实是不适合作为索引的数据结构。

2)为什么不采用Hash表呢:

因为Hash索引不适用于范围查找。

3)为什么不采用红黑树呢:

因为当MySQL数据量很大的时候,索引的体积也会很大,可能内存放不下,所以需要从磁盘上进行相关读写,如果树的层级太高了,则读写磁盘的次数(I/O的交互)就会越多,性能就会越差。红黑树目前唯一的不足点就是它的树的高度是不可控的。

4)那为什么要用B+树,而不用B树呢:

B树 只适合随机检索,而B+树 同时支持随机检索和顺序检索;

B+树 空间利用率更高,可减少I/O次数,磁盘读写代价更低。 一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储的磁盘上。这样的话,索引查找过程中就要产生磁盘I/O消耗。B+树 的内部结点并没有指向关键字具体信息的指针,只是作为索引使用,其内部结点比B树小,盘块能容纳的结点中关键字数量更多,一次性读入内存中可以查找的关键字也就越多,相对的,IO读写次数也就降低了。而IO读写次数是影响索引检索效率的最大因素;

B+树的查询效率更加稳定B树 搜索有可能会在非叶子结点结束,越靠近根节点的记录查找时间越短,只要找到关键字即可确定记录的存在,其性能等价于在关键字全集内做一次二分查找。而在B+树 中,顺序检索比较明显,随机检索时,任何关键字的查找都必须走一条从根节点到叶节点的路,所有关键字的查找路径长度相同,导致每一个关键字的查询效率相当;

B-树 在提高了磁盘IO性能的同时并没有解决元素遍历的效率低下的问题。B+树 的叶子节点使用指针顺序连接在一起,只要遍历叶子节点就可以实现整棵树的遍历。而且在数据库中基于范围的查询是非常频繁的,而B树 不支持这样的操作;

增删文件(节点)时,效率更高。因为B+树 的叶子节点包含所有关键字,并以有序的链表结构存储,这样可很好提高增删效率。

总结:

B树 的单个结点存储的元素比B+树多,自然在整个过程中的磁盘I/O交互就会比 B+树 多,增加了性能开销;

② 相对B-tree来说,B+树所有的查询最终都会在叶子结点上,这也是B+树性能稳定的原因的一个体现;

B+树所有的叶子结点都是通过双向链表相连,范围查询非常方便,这也是B+树最明显的优势。

常见面试题:为什么MySQL索引要用B+Tree呢?(看完你就能和面试官笑谈人生了)相关推荐

  1. 常见面试题:为什么HashMap不是线程安全的呢?(JDK1.7和JDK1.8角度)(看完你就能和面试官笑谈人生了)

    title: 常见面试题:为什么HashMap不是线程安全的呢?(JDK1.7和JDK1.8角度)(看完你就能和面试官笑谈人生了) tags: 面试常见题 常见面试题:为什么HashMap不是线程安全 ...

  2. 腾讯面试题:char 和 varchar的最大长度是多少,以及他们之间的区别(看完你就能和面试官笑谈人生了)

    title: 腾讯面试题:char 和 varchar的最大长度是多少,以及他们之间的区别(看完你就能和面试官笑谈人生了) tags: 面试常见题 腾讯面试题:char 和 varchar的最大长度是 ...

  3. 腾讯面试题:创建索引时,你会怎么考虑呢?(看完你就能和面试官谈人生了)

    title: 腾讯面试题:创建索引时,你会怎么考虑呢?(看完你就能和面试官谈人生了) tags: 面试常见题 腾讯面试题:创建索引时,你会怎么考虑呢?(看完你就能和面试官谈人生了) 腾讯面试题:创建索 ...

  4. 【MySQL】索引常见面试题

    文章目录 索引常见面试题 什么是索引 索引的分类 什么时候需要 / 不需要创建索引? 有什么优化索引的方法? 从数据页的角度看B + 树 InnoDB是如何存储数据的? B + 树是如何进行查询的? ...

  5. MySQL常见面试题及答案汇总1000道(春招+秋招+社招)

    MySQL面试题以及答案整理[最新版]MySQL高级面试题大全(2021版),发现网上很多MySQL面试题都没有答案,所以花了很长时间搜集,本套MySQL面试题大全,汇总了大量经典的MySQL程序员面 ...

  6. MySQL数据库常见面试题总结

    1.数据库的常用范式: 第一范式(1NF):指表的列不可再分,数据库中表的每一列都是不可分割的基本数据项,同一列中不能有多个值: 第二范式(2NF):在 1NF 的基础上,还包含两部分的内容:一是表必 ...

  7. ElasticSearch搜索引擎常见面试题总结

    一.ElasticSearch基础: 1.什么是Elasticsearch: Elasticsearch 是基于 Lucene 的 Restful 的分布式实时全文搜索引擎,每个字段都被索引并可被搜索 ...

  8. RabbitMQ消息队列常见面试题总结

    1.什么是消息队列: 1.1.消息队列的优点: (1)解耦:将系统按照不同的业务功能拆分出来,消息生产者只管把消息发布到 MQ 中而不用管谁来取,消息消费者只管从 MQ 中取消息而不管是谁发布的.消息 ...

  9. SpringMVC常见面试题总结(超详细回答)

    1.什么是Spring MVC ?简单介绍下你对springMVC的理解? Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,通过把Model,View,C ...

最新文章

  1. 3ds Max绘制青花瓷茶壶
  2. php给图片加图片水印,php给图片添加文字或图片水印实现代码
  3. delphi 获取打印机默认纸张_Delphi 动态调整打印机纸张大小
  4. (九)演员-评论员算法
  5. Non-standard serial port baud rate setting
  6. 第二章 变量和基本类型
  7. 妙用VM的“远程显示”功能
  8. u盘读写测试_aigo U395固态U盘评测,速度可能会吓到你,价格很良心
  9. 符号级别(一)--基础概念
  10. 【CCCC】PAT : 团体程序设计天梯赛-练习集 L3 答案(01-23)
  11. 2022软件库iAPP源码前端/后端程序整套独立后台
  12. 有功功率、无功功率 和 视在功率之间的关联
  13. NODE.JS DM数据库驱动简介及搭建
  14. 处理亚马逊差评的几个方法
  15. 软件测试工程师如何优雅的“甩锅”
  16. nginx传递真实客户端ip
  17. 聊一聊I/O那些事儿
  18. linux命令tail-f,Linux中的tail命令的详细解释
  19. 蒸汽对罗斯蒙特涡街流量计的影响
  20. oracle 数据库碎片化管理

热门文章

  1. 【Prometheus】Exporter详解
  2. MySQL中exists与in的使用
  3. svn 命令行创建和删除 分支和tags
  4. python strptime_Python法律实务应用——制作自己的LPR计算器(上)
  5. linux 脚本给设备节点权限,[Linux] I2C设备读写及文件节点创建
  6. oracle如何实现多副本,Oracle同一节点副本数据库启动
  7. 2、使用 kubeadm 方式快速部署K8S集群
  8. mysql 表字段大小写敏感_各种数据库大小写敏感问题总结
  9. android组件浮动在activity上_Jetpack Hilt 依赖注入框架上手指南
  10. iphonex黑屏开不了机_iphonexr黑屏,iphonexr突然开不了机