本文献给准备面试或者是还在面试的你。常见面试题,送分题目,不拿白不拿。本文收录在个人博客《愚公要移山》中,地址 www.javachat.cc

这篇是修改版,针对知乎上很多人提出的问题,进行了一次修复

一、B树和B+树的区别

很明显,我们想向弄清楚原因就要知道B树和B+树的区别。为了不长篇大论。我们直接给出他们的形式总结他们的特点。

1、B树

B树是一种自平衡的搜索树,形式很简单:

这就是一颗B-树。针对我们这个问题的最核心的特点如下:

(1)多路,非二叉树

(2)每个节点既保存索引,又保存数据

(3)搜索时相当于二分查找

其他的基本上都是一些常见的数据结构,假定都已经了解了B树相关的结构。

2、B+树

B+树是B树的变种

最核心的特点如下:

(1)多路非二叉

(2)只有叶子节点保存数据

(3)搜索时相当于二分查找

(4)增加了相邻接点的指向指针。

从上面我们可以看出最核心的区别主要有俩,

一个是数据的保存位置:B树保存在所有的节点中,B+树保存在叶子节点

一个是相邻节点的指向:B树叶子节点之间没有指针,B+树有

这里区别分别给B树和B+树带来了什么好处呢?其实对于数据库来说,选用什么数据结构无非就是为了增删改查和存储更加高效,因为找特点时也要从这个点去回答。

3、从区别找特点

第一:查找元素

(1)B树的数据保存在所有节点,查询复杂度最好是 O(1)。

(2)B+树的数据保存在叶子节点,查询时间复杂度固定是O(log(n))

第二:区间查找

(1)B树每个节点 key 和 data 在一起,则无法区间查找。

(2)B+树相邻接点的指针可以大大增加区间访问性,可使用在范围查询等

第三:存储

(1)B树每个节点即保存数据又保存索引,所以每一节点特别大,这一层所有节点加起来数据量将非常大。磁盘每次IO一定量的数据,对于Mysql来说如何衡量查询效率呢?就是磁盘IO次数。既然B树每一层特别大,那每一层就需要对数据分开从而进行多次IO操作。所有Mysql不用。

(2)B+树更适合外部存储,也就是磁盘存储。由于内节点无 data 域,每个节点能索引的范围更大更精确,所以不需要用B+树。

有了他们的区别之后,现在我们再来解释这个原因就好多了。

二、原因解释

上面解释了不使用的原因,我们再来看为什么Mysql使用B+树,而MongoDB使用B树,想要解释原因,我们还必须要了解一下MongoDB和Mysql的基本概念。

1、MongoDB

MongoDB 是文档型的数据库,是一种 nosql,它使用类 Json 格式保存数据。比如之前我们的表可能有用户表、订单表、购物篮表等等,还要建立他们之间的外键关联关系。但是类Json就不一样了。

我们可以看到这种形式更简单,通俗易懂。那为什么 MongoDB 使用B-树呢?

MongoDB使用B树,所有节点都有Data域,只要找到指定索引就可以进行访问,无疑单次查询平均快于Mysql。

2、Mysql

Mysql作为一个关系型数据库,数据的关联性是非常强的,区间访问是常见的一种情况,B+树由于数据全部存储在叶子节点,并且通过指针串在一起,这样就很容易的进行区间遍历甚至全部遍历。

还有一点,B+树只有叶子节点保存数据,所以每一节点比较小,每一层所有节点加起来数据量也相对比较小。磁盘每次IO一定量的数据,对于Mysql来说。既然B+树每一层小,那每一层只需要少量IO操作。

这俩区别的核心如果你能看懂B-树和B+树的区别就很容易理解。

mongodb mysql 知乎_为什么 MongoDB 索引选择B-树,而 Mysql 索引选择B+树(精干总结)...相关推荐

  1. mongodb mysql json数据_使用MongoDB与MySQL有很多JSON字段?

    所以,直接回答问题- Shall we chose mongodb if half of data is schemaless, and is being stored as JSON if usin ...

  2. mangouDB和mysql的区别_谈谈mongodb,mysql的区别和具体应用场景

    最近对数据库比较感兴趣,于是就去研究了下部分相关热门的数据库. MySQL 关系型数据库. 在不同的引擎上有不同 的存储方式. 查询语句是使用传统的sql语句,拥有较为成熟的体系,成熟度很高. 开源数 ...

  3. mysql sqlserver对比_很用心的写了 9 道 MySQL 面试题

    MySQL 一直是本人很薄弱的部分,后面会多输出 MySQL 的文章贡献给大家,毕竟 MySQL 涉及到数据存储.锁.磁盘寻道.分页等操作系统概念,而且互联网对 MySQL 的注重程度是不言而喻的,后 ...

  4. mysql更新加锁_一条简单的更新语句,MySQL是如何加锁的?

    看如下一条sql语句: #tableT(idint,namevarchar(20))deletefromTwhereid=10: MySQL在执行的过程中,是如何加锁呢? 再看下面这条语句: sele ...

  5. mysql执行底层_天天写order by,你知道Mysql底层如何执行吗?

    在实际的开发中一定会碰到根据某个字段进行排序后来显示结果的需求,但是你真的理解order by在 Mysql 底层是如何执行的吗? 假设你要查询城市是苏州的所有人名字,并且按照姓名进行排序返回前 10 ...

  6. php mysql query 创建_借助PHP的mysql_query()函数来创建MySQL数据库的教程_MySQL

    以mysql_query()函数作为教程的基础前提,我们先来看一下mysql_query()的用法: mysql_query()函数PHP MySQL 函数库中,mysql_query() 函数用于向 ...

  7. java获取mysql执行计划_好程序员Java学习路线之MySQL的执行计划

    好程序员 Java 学习路线之 MySQL 的执行计划.什么是执行计划? 执行计划通常是开发者优化 SQL 语句的第一步. MySQL 在解析 SQL 语句时,会生成多套执行方案,然后内部会进行一个成 ...

  8. 二级mysql教程下载_全国计算机等级考试教程:二级MySQL数据库程序设计

    第一章 数据库技术的基本概念与方法 1.1 基本概念 1.2 数据库系统的特点 1.3 数据库系统的结构 1.3.1 数据库系统的三级模式结构 1.3.2 三级模式结构的两层映像与两级数据独立性 1. ...

  9. php与mysql核心题目_必看!PHP常见面试题——MySQL篇(三)

    21.简要说一下数据库范式? 第一范式(1NF):强调的是列的原子性,即数据库表的每一列都是不可分割的原子数据项. 第二范式(2NF):要求实体的属性完全依赖于主关键字.所谓完全依赖是指不能存在仅依赖 ...

最新文章

  1. [导入]伍迷创意随想集 之 聚众广告创精品
  2. dedecms上传图片不自动改名,以利于seo图片优化
  3. 运维软件PE工具箱下载附制作、安装教程
  4. 第一部分:数据中心专业名词你知道多少?
  5. 使用PowerShell deprovision O365 资源
  6. ACCESS SQL语法参考
  7. LindAgile~缓存拦截器支持类的虚方法了
  8. licens 问题 Error (292028): Specified license is not valid for this machine
  9. java-GUI实现汽车租赁管理系统
  10. Aerospike SSD模式下,刷写磁盘和写入数据swb的关系
  11. [转]应对新劳动法:华为万名员工“自愿”辞职[http://news.qq.com/a/20071030/001675.htm]
  12. 银行使用计算机和网络实现个人存款,观察值与算术平均数的差数称为离均差,其总和为( )。...
  13. redis设置可远程访问
  14. Codeforces Round #663 (Div. 2) A-D
  15. 从零开始学习React——(六):React响应式设计和数据绑定
  16. origin多图叠加_origin 将两张图放在一起??
  17. office2021无法启动mircrosoft outlook 无法启动outlook视窗 怎么解决
  18. 度量、流水线能力再升级,博云DevOps产品发布V3.3版本
  19. FTPRush.v1.1.219.Unicode-YAG
  20. 【NOIP2017提高组】小凯的疑惑

热门文章

  1. c++逆天改命进阶--哈希表
  2. vue 中嵌入iframe页面
  3. 计算机体系结构 第7章 存储系统(2)
  4. (转载)互联网鄙视食物链大全
  5. 使用<style>标签为元素定义CSS样式
  6. 【算法宇宙——在故事中学算法】背包dp之完全背包问题
  7. sudoku me_Sudoku,一个完整的MFC应用程序。 第7部分
  8. 写入iCloud在模拟器和真机上失败的解决办法
  9. 在虚拟机下运行gazebo,关于vmw_ioctl_command error Invalid argument错误
  10. MySQL 查询历史sql记录