这个问题是我在看视频的时候老师提到的,虽然之前知道他们各自的索引结构但是还没有研究过原因。在网上一搜答案特别多。但是都特别的啰嗦。于是总结了这篇文章。

一、B-树和B+树的区别

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

1、B-树

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

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

(1)多路,非二叉树

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

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

在这里我们假定都已经了解了B树相关的结构。

2、B+树

B+树是B-树的变种

最核心的特点如下:

(1)多路非二叉

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

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

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

从上面我们可以看出最核心的区别主要有俩,一个是数据的保存位置,一个是相邻节点的指向。就是这俩造成了MongoDB和Mysql的差别。为什么呢?

3、B-树和B+树的区别

(1)B+树查询时间复杂度固定是logn,B-树查询复杂度最好是 O(1)。

(2)B+树相邻接点的指针可以大大增加区间访问性,可使用在范围查询等,而B-树每个节点 key 和 data 在一起,则无法区间查找。

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

(4)注意这个区别相当重要,是基于(1)(2)(3)的,B-树每个节点即保存数据又保存索引,所以磁盘IO的次数很少,B+树只有叶子节点保存,磁盘IO多,但是区间访问比较好。

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

二、原因解释

想要解释原因,我们还必须要了解一下MongoDB和Mysql的基本概念。

1、MongoDB

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

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

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

2、Mysql

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

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

mysql -b -e_为什么 MongoDB 索引选择B-树,而 Mysql 索引选择B+树(精干总结)相关推荐

  1. mysql -ss -e_课内资源 - 基于ssm框架和mysql的网上选课系统

    一.需求分析 1.1 业务需求 随着社会的发展,学生的人数和课程种类急速增加,传统的选课管理模式已经无法满足当前的实际需求,为此我们开发了学生选课管理系统.本人结合学生选课管理的实际需要,完成了对学生 ...

  2. 面试mysql中怎么创建索引_阿里面试:MySQL如何设计索引更高效?

    有情怀,有干货,微信搜索[三太子敖丙]关注这个不一样的程序员. 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试完整考点.资料以及我的系列文章. ...

  3. 建立了索引怎么使用_对MySQL索引的认识

    1.你一般怎么建索引的? 去my.cnf里配置三个配置 打开慢查询日志slow_query_log=1慢查询日志存储路径slow_query_log_file=/var/log/mysql/log-s ...

  4. B+树在MySQL索引的应用和InnoDB的索引优化

    B树索引算法介绍 1.B树 B树又称为多路平衡查找树,它类似普通的平衡二叉树,不同的一点是B树允许每个节点有更多的子节点. B树有如下特点: 具有n个关键字的节点含有(n+1)棵子树 所有键值分布在整 ...

  5. MySQL、Redis、MongoDB安装

    强烈建议使用Docker来安装,简单快速便捷,一条命令搞定,不会因为系统少某的东西而折腾浪费时间. MySQL.Redis.MongoDB等安装[Docker版] MySQL安装 MySQL安装官网文 ...

  6. 常用数据库 知识点大全 (Mysql,Redis,MongoDB)

    目录 Mysql 1.1 5大引擎 共10个 1.2 事务 1.3 锁1 锁2 1.4 Btree/B+tree 1.5 mysql进阶 Redis 2.1 Redis介绍 2.2 redis的五大数 ...

  7. python3数据存储—四个数据库(sqlite,mysql,redis,mongodb)

    文章目录 前言 一.python3 操作sqlite,mysql,redis,mongodb 二.python 标准库 sqlite3模块 1.引入库 2.代码示例 三.python 三方库 pymy ...

  8. mysql索引空间太大_MySQL优化索引

    1.  MySQL如何使用索引 索引用于快速查找具有特定列值的行.如果没有索引,MySQL必须从第一行开始,然后遍历整个表以找到相关的行.表越大,花费越多.如果表中有相关列的索引,MySQL可以快速确 ...

  9. Mysql高级调优篇——第一章:调优必备索引知识

    1.Sql预热 常见的七种Join理论,看图就非常清晰 左连接:A独有+在A中的B部分 select * from A left join B on A.key = B.key 因为没有满足A的B,所 ...

最新文章

  1. 添加三维动画 demo
  2. 20155227《网络对抗》Exp5 MSF基础应用
  3. Linux crontab定时任务示例
  4. 资源 | Deeplearning.ai课程与笔记汇总
  5. ASP.NET Core开源Web应用程序框架ABP
  6. 算法设计与分析——递归与分治策略——最接近点对问题
  7. eclipse工程导入Android Studio
  8. ASP.NET MVC+LINQ开发一个图书销售站点(9):编辑目录
  9. VMware虚拟化上安装F5负载均衡系统(BIG-IP LTM)
  10. Yahoo!用户体验与设计前副总裁推荐——《设计模式》
  11. vue 圆形百分比进度条_vue 圆形进度条组件解析
  12. 均匀线阵常规波束形成 matlab程序,波束形成Matlab程序
  13. 总结:Python 轻量级序列化和反序列化包 marshmallow 详细使用指南
  14. ClickHouse安装部署
  15. 大数据BI平台建设需注意什么问题
  16. solidity 中的时间_Solidity官方文档中文版.pdf
  17. 细述QQ与TIM的不同之处
  18. [zz]64bitnbsp;ubuntunbsp;安装32bit软件
  19. cai课件 计算机辅助创新,浅谈cai课件制作的几个问题
  20. 基于ArduPilot的旋翼式无人机飞行器开发系列(三,四轴无人机的组成)

热门文章

  1. hdu 3657 最大点权独立集变形(方格取数的变形最小割,对于最小割建图很好的题)...
  2. 如何将 byte[] 转换为 IntPtr?
  3. MySQL问题解决:-bash:mysql:command not found
  4. 百度知识图谱技术及应用
  5. 真不是炼丹,务实敢为的 MoCo v3
  6. python的itertools库_Python标准库itertools模块使用方法
  7. 压缩pdf大小_PDF压缩到指定大小该怎么操作?分享完成PDF压缩超好用的方法
  8. python re模块安装_python re模块
  9. php 绝对刷新,vue项目线上页面刷新报404 解决方法(绝对有用)
  10. LeetCode刷题(9)