1. B树和B+树的区别

(1)在B树中,你可以将键和值存放在内部节点和叶子节点;但在B+树中,内部节点都是键,没有值,叶子节点同时存放键和值。

(2)B+树的叶子节点有一条链相连,而B树的叶子节点各自独立。

  1. 使用B树的好处B树可以在内部节点同时存储键和值,因此,把频繁访问的数据放在靠近根节点的地方将会大大提高热点数据的查询效率。这种特性使得B树在特定数据重复多次查询的场景中更加高效。

  2. 使用B+树的好处由于B+树的内部节点只存放键,不存放值,因此,一次读取,可以在内存页中获取更多的键,有利于更快地缩小查找范围。B+树的叶节点由一条链相连,因此,当需要进行一次全数据遍历的时候,B+树只需要使用O(logN)时间找到最小的一个节点,然后通过链进行O(N)的顺序遍历即可。而B树则需要对树的每一层进行遍历,这会需要更多的内存置换次数,因此也就需要花费更多的时间

  3. Hash索引和B+树所有有什么区别或者说优劣呢?首先要知道Hash索引和B+树索引的底层实现原理:hash索引底层就是hash表,进行查找时,调用一次hash函数就可以获取到相应的键值,之后进行回表查询获得实际数据。B+树底层实现是多路平衡查找树。对于每一次的查询都是从根节点出发,查找到叶子节点方可以获得所查键值,然后根据查询判断是否需要回表查询数据。那么可以看出他们有以下的不同:

(1)hash索引进行等值查询更快(一般情况下),但是却无法进行范围查询。因为在hash索引中经过hash函数建立索引之后,索引的顺序与原顺序无法保持一致,不能支持范围查询。而B+树的的所有节点皆遵循(左节点小于父节点,右节点大于父节点,多叉树也类似),天然支持范围。

(2)hash索引不支持使用索引进行排序,原理同上。

(3)hash索引不支持模糊查询以及多列索引的最左前缀匹配。原理也是因为hash函数的不可预测。AAAA和AAAAB的索引没有相关性。

(4)hash索引任何时候都避免不了回表查询数据,而B+树在符合某些条件(聚簇索引,覆盖索引等)的时候可以只通过索引完成查询。

(5)hash索引虽然在等值查询上较快,但是不稳定。性能不可预测,当某个键值存在大量重复的时候,发生hash碰撞,此时效率可能极差。而B+树的查询效率比较稳定,对于所有的查询都是从根节点到叶子节点,且树的高度较低。因此,在大多数情况下,直接选择B+树索引可以获得稳定且较好的查询速度。而不需要使用hash索引。

  1. 数据库为什么使用B+树而不是B树

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

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

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

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

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

最后,小编分类整理了许多java进阶学习材料和BAT面试给热爱IT行业的你,如果需要资料的请转发此文章后再私聊小编回复【java】就能领取2019年java进阶学习资料和BAT面试题以及《Effective Java》(第3版)电子版书籍。也可以加群:712263501领取海量学习资料进行学习。

MySQL面试题 | 附答案解析(六)相关推荐

  1. MySQL面试题 | 附答案解析(十六)

    接上篇!!! 2. SQL的生命周期? (1)应用服务器与数据库服务器建立一个连接 (2)数据库进程拿到请求sql (3)解析并生成执行计划,执行 (4)读取数据到内存并进行逻辑处理 (5)通过步骤一 ...

  2. MySQL面试题 | 附答案解析(二十)

    接上篇!!! 5. MySQL的复制原理以及流程 主从复制:将主数据库中的DDL和DML操作通过二进制日志(BINLOG)传输到从数据库上,然后将这些日志重新执行(重做):从而使得从数据库的数据与主数 ...

  3. MySQL面试题 | 附答案解析(十九)

    数据库优化 1. 为什么要优化 (1)系统的吞吐量瓶颈往往出现在数据库的访问速度上 (2)随着应用程序的运行,数据库的中的数据会越来越多,处理时间会相应变慢 (3)数据是存放在磁盘上的,读写速度无法和 ...

  4. MySQL面试题 | 附答案解析(十八)

    接上篇!!! SQL语句优化的一些方法 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 n ...

  5. MySQL面试题 | 附答案解析(十七)

    接上篇!!! 9. 主键使用自增ID还是UUID? 推荐使用自增ID,不要使用UUID. 因为在InnoDB存储引擎中,主键索引是作为聚簇索引存在的,也就是说,主键索引的B+树叶子节点上存储了主键索引 ...

  6. MySQL面试题 | 附答案解析(十五)

    SQL优化 1. 如何定位及优化SQL语句的性能问题?创建的索引有没有被使用到?或者说怎么才可以知道这条语句运行很慢的原因? 对于低性能的SQL语句的定位,最重要也是最有效的方法就是使用执行计划,My ...

  7. MySQL面试题 | 附答案解析(十四)

    接上篇!!! 5. 什么是子查询 (1)QL语句的查询结果做为另一条查询语句的条件或查询结果 (2)SQL语句嵌套使用,内部的SQL查询语句称为子查询. 6. 子查询的三种情况 (1)询是单行单列的情 ...

  8. MySQL面试题 | 附答案解析(十三)

    常用SQL语句 1. SQL语句主要分为哪几类 数据定义语言DDL(Data Ddefinition Language)CREATE,DROP,ALTER 主要为以上操作 即对逻辑结构等有操作的,其中 ...

  9. MySQL面试题 | 附答案解析(十二)

    (一)存储过程与函数 什么是存储过程?有哪些优缺点? 存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需要创建一次,以后在该程序中就可以调用多次.如果某次操作需要执行多次SQL,使用 ...

最新文章

  1. php7.0 + mysql5.7.10 + nginx7.0 web开发环境搭建(CentOS7)
  2. 关于在html中正常,在aspx中乱码的问题
  3. Leonbao:MapKit学习笔记
  4. BizTalk动手实验(十六)EDI-AS2解决文案开发配置
  5. 如何提高PHP代码的质量?第三部分 端到端/集成测试
  6. NLPIR语义智能平台支持大数据个性化学习
  7. 10慕课网《进击Node.js基础(一)》初识promise
  8. 【优化覆盖】基于matlab改进的鲸鱼算法求解无线传感器WSN覆盖优化问题【含Matlab源码 XYQMDXP001期】
  9. UVA 1153 Keep the Customer Satisfied 顾客是上帝(贪心)
  10. 西门子S7-1200、1500固件更新第三方设备GSD导入
  11. android 9.0极光推送闪退,极光推送集成Module中遇到的坑
  12. 固态硬盘分为哪几种_固态硬盘分类简介和选择
  13. 【学习记录】名词和名词性从句
  14. 如何修改 / 校正Linux系统时间
  15. 基于Javaweb的社区门诊系统的设计与实现MIB信息采集
  16. Jpeg-9e源码编译(Win10,VS2022)
  17. Gluster文件系统
  18. 决策树留一法python代码_从实例中归纳决策树_人工智能一
  19. 交通流量预测-混合注意力时空图卷积-ASTGCN
  20. 如何用Github API操作github和gist(v3)

热门文章

  1. GPU微观物理结构框架
  2. Servlet----ServletContext
  3. 2021年大数据Spark(三十二):SparkSQL的External DataSource
  4. Python:Spider
  5. launchctl mysql_Mac Yosemite 10.10 下利用 Launchctl 自启动 mysql
  6. 行情跌宕起伏,或许你可以买这个代币?
  7. 2022-2028年中国医学模拟教育产品市场供需现状及投资战略研究报告
  8. Go 学习笔记(50)— Go 标准库之 net/url(查询转义、查询参数增/删/改/查、解析URL)
  9. iOS开发-xcdatamodeld文件 CoreData的介绍和使用,sqlite的使用
  10. day18——sql优化——绑定变量