先说B树和B+树的区别

B树:非叶子节点也存储数据

B+树:只有叶子节点存储数据,且所有叶子节点通过指针相连接。

为什么MongoDB选择B树而,MySQL选择B+树呢?两种数据结构的区别摆在上面了,那就看MongoDB和MySQL的需求

首先:

MongoDB属于文档型存储的NoSQL,意味着它并不是关系型数据库,既然如此,基本不会出现批量连续数据的查询,那么B+树的叶子节点通过指针相连接对于MongoDB来说,就没多少价值了。

再看看B树的优缺点(相对于B+树):

优点:数据直接存在于非叶子节点上,最近查询时间复杂度为O(1)

缺点:叶子节点不通过指针连接,不适合范围查询

到这里,基本已经清楚了为什么MongoDB选择B树而不是B+树了。

解释一下为什么文档型NoSQL为什么基本不会出现连续数据查询:

关系型数据库的数据结构

id type
1 a
2 a
3 b

如果通过type构建索引,查询是:

SELECT id FROM t1 WHERE type='a';

是不是查找一段连续的数据呢?或者包含join的查询同理

那么MongoDB就不会有这种查询吗?

不是不会有这种查询,而是一般不会这样设计

MongoDB中的设计

{
    "_id":"1",
    "type":"a",
    "id":[
        1,
        2,
        3
    ]
}

看到了吗?用type建立索引,查询一条数据就拿到想要的结果了。

引发思考(私货):

MongoDB很多情况下用来存储日志,如果需要将日志分类存储,且对查询速度要求较高,可以通过物化视图,将同类的日志内容合并,提高查询速度。

【学习日志】MongoDB为什么选择B树,而MySQL选择B+树实现索引的更多相关文章

  1. 为什么 MySQL 使用 B+ 树

    为什么 MySQL 使用 B+ 树是面试中经常会出现的问题,很多人对于这个问题可能都有一些自己的理解,但是多数的回答都不够完整和准确,大多数人都只会简单说一下 B+ 树和 B 树的区别,但是都没有真正 ...

  2. MySQL用B+树(而不是B树)做索引的原因

    众所周知,MySQL的索引使用了B+树的数据结构.那么为什么不用B树呢? 先看一下B树和B+树的区别. B树 维基百科对B树的定义为"在计算机科学中,B树(B-tree)是一种树状数据结构, ...

  3. 为什么 MongoDB (索引)使用B-树而 Mysql 使用 B+树

    B-树由来 定义:B-树是一类树,包括B-树.B+树.B*树等,是一棵自平衡的搜索树,它类似普通的平衡二叉树,不同的一点是B-树允许每个节点有更多的子节点.B-树是专门为外部存储器设计的,如磁盘,它对 ...

  4. 【原创】为什么Mongodb索引用B树,而Mysql用B+树?

    引言 好久没写文章了,今天回来重操旧业.毕竟现在对后端开发的要求越来越高,大家要做好各种准备. 因此,大家有可能遇到如下问题 为什么Mysql中Innodb的索引结构采取B+树? 回答这个问题时,给自 ...

  5. 为什么Mongodb索引用B树,而Mysql用B+树?

    引言 好久没写文章了,今天回来重操旧业. 今天讲的这个主题,是<面试官:谈谈你对mysql索引的认识>,里头提到的一个坑. 也就是说,如果面试官问的是,为什么Mysql中Innodb的索引 ...

  6. MongoDB学习笔记:MongoDB 数据库的命名、设计规范

    MongoDB学习笔记:MongoDB 数据库的命名.设计规范     第一部分,我们先说命名规范. 文档 设计约束 UTF-8 字符 不能包含 \0 字符(空字符),这个字符标识建的结尾 . 和 $ ...

  7. [转] Linux学习之CentOS(十三)--CentOS6.4下Mysql数据库的安装与配置

    from:  http://www.cnblogs.com/xiaoluo501395377/archive/2013/04/07/3003278.html 如果要在Linux上做j2ee开发,首先得 ...

  8. Linux学习之CentOS(十三)--CentOS6.4下Mysql数据库的安装与配置

    原文:http://www.cnblogs.com/xiaoluo501395377/archive/2013/04/07/3003278.html 如果要在Linux上做j2ee开发,首先得搭建好j ...

  9. MySql学习(七) —— 查询性能优化 深入理解MySql如何执行查询

    本篇深入了解查询优化和服务器的内部机制,了解MySql如何执行特定查询,从中也可以知道如何更改查询执行计划,当我们深入理解MySql如何真正地执行查询,明白高效和低效的真正含义,在实际应用中就能扬长避 ...

  10. MongoDB索引(一) --- 入门篇:学习使用MongoDB数据库索引

    这个系列文章会分为两篇来写: 第一篇:入门篇,学习使用MongoDB数据库索引 第二篇:进阶篇,研究数据库索引原理--B/B+树的基本原理 1. 准备工作 在学习使用MongoDB数据库索引之前,有一 ...

随机推荐

  1. Node.js的学习(二)node.js 模块化

    一.Node.js模块化 1.模块化概要 早期的javascript版本没有块级作用域.没有类.没有包.也没有模块,这样会带来一些问题,如复用.依赖.冲突.代码组织混乱等,随着前端的膨胀,模块化显得非 ...

  2. Hutool 的学习

    1. Hutool 介绍 Hutool 是一个小而全的Java工具类库,通过静态方法封装,降低相关API的学习成本,提高工作效率,使Java拥有函数式语言般的优雅,让Java语言也可以"甜甜 ...

  3. 备考CISP-PTE之文件上传

    upload-labs 直接下载放到phpstudy打开即可. 第一关 查看源码,可以看到js代码定义了一个checkFile函数来对上传的文件进行后缀检查,只允许上传jpg.png.gif文件. f ...

  4. PLC攻击(一):应用层攻击

    ​ 转载请注明出处:信安科研人please subscribe my official wechat :信安科研人获取更多安全资讯 参考文献: A Stealth Program Injection  ...

  5. Web浏览器Linux Shell(shellinabox解决通用区服务器Linux Shell访问很麻烦的问题)

    问题背景 通用区服务器的Linux Shell访问,比较麻烦 需要动态密码(手机上装Token)连跳板机,再用跳板机上的终端工具连Linux Shell 改进方法 使用shellinabox,就能直接 ...

  6. hashcat 命令

    hashcat --force --stdout -a 6 tmp.txt ?d?d?d?d?d?d?d > result.txt tips:将tmp.txt字典中的内容与7位随机掩码字符组合, ...

  7. CPU体系(2):ARM Store Buffer

    本文主要翻译自 Arm Cortex-M7 Processor Technical Reference Manual r1p2 其中章节 Memory System / L1 caches / Sto ...

  8. C++ 一个简洁的CHECK宏

    #define CHECK2(condition, message) \ (!(condition)) ? (std::cerr << "Assertion failed: (& ...

  9. 记录一次PyQt5内存泄漏的问题解决

    前言 前几天利用python-mpv写了一个播放器,但是跑着跑着发现内存越来越大,经过我反复调试终于解决了这个问题. 解决思路 模块定位 首先我是一个模块一个模块测试的,这样可以尽快缩减出问题的代码范 ...

  10. Nginx 安装篇-yum安装

    yum安装教程引用: https://www.cnblogs.com/AprilBlank/p/11388990.html#1-yum安装推荐 避坑事项: 暂无