NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

为什么 MongoDB 使用 B 树 (一)

  • 2019-12-26
  • 本文字数:1182 字

    阅读完需:约 4 分钟

为什么 MongoDB 使用 B 树 (一)

为什么这么设计(Why’s THE Design)是一系列关于计算机领域中程序设计决策的文章,我们在这个系列的每一篇文章中都会提出一个具体的问题并从不同的角度讨论这种设计的优缺点、对具体实现造成的影响。如果你有想要了解的问题,可以在文章下面留言。


我们在这一系列前面的文章曾经分析过 为什么 MySQL 使用 B+ 树,有读者在文章下面留言,希望能出一个为什么 MongoDB 使用 B 树的对比文章,这是一个比较好的问题,MySQL 和 MongoDB 两种不同类型的数据库使用了相似却不同的数据结构,为什么 MySQL 选择使用 B+ 树而 MongoDB 使用 B 树呢?

概述

MongoDB 是一个通用的、面向文档的分布式数据库1,这是官方对 MongoDB 介绍。区别于传统的关系型数据库 MySQL、Oracle 和 SQL Server,MongoDB 最重要的一个特点就是『面向文档』,由于数据存储方式的不同,对外提供的接口不再是被大家熟知的 SQL,所以被划分成了 NoSQL,NoSQL 是相对 SQL 而言的,很多我们耳熟能详的存储系统都被划分成了 NoSQL,例如:Redis、DynamoDB2 和 Elasticsearch 等。



NoSQL 经常被理解成没有 SQL(Non-SQL)或者非关系型(Non-Relational)3,不过也有人将其理解成不只是 SQL(Not Only SQL)4,深挖这个词的含义和起源可能没有太多意义,这种二次解读很多时候都是为营销服务的,我们只需要知道 MongoDB 对数据的存储方式与传统的关系型数据库完全不同。


MongoDB 的架构与 MySQL 非常类似,它们底层都使用了可插拔的存储引擎以满足用户的不同需求,用户可以根据数据特征选择不同的存储引擎,最新版本的 MongoDB 使用了 WiredTiger 作为默认的存储引擎5



作为 MongoDB 默认的存储引擎,WiredTiger 使用 B 树作为索引底层的数据结构,但是除了 B 树之外,它还支持 LSM 树作为可选的底层存储结构,LSM 树的全称是 Log-structured merge-tree,你可以在 MongoDB 中使用如下所示的命令创建一个基于 LSM 树的集合(Collection)6:


JavaScript


db.createCollection(    "posts",    { storageEngine: { wiredTiger: {configString: "type=lsm"}}})
复制代码


我们在这篇文章中不仅会介绍 MongoDB 的默认存储引擎 WiredTiger 为什么选择使用 B 树而不是 B+ 树,还会对 B 树和 LSM 树之间的性能和应用场景进行比较,帮助各位读者更全面地理解今天的问题。

设计

既然要比较两个不同数据结构与 B 树的差别,那么在这里我们将分两个小节分别介绍 B+ 树和 LSM 树为什么没有成为 WiredTiger 默认的数据结构:


  • 作为非关系型的数据库,MongoDB 对于遍历数据的需求没有关系型数据库那么强,它追求的是读写单个记录的性能;

  • 大多数的数据库面对的都是读多写少的场景,B 树与 LSM 树在该场景下有更大的优势;


上述的两个场景都是 MongoDB 需要面对和解决的,所以我们会在这两个常见场景下对不同的数据结构进行比较。


本文转载自 Draveness 技术博客。


原文链接:https://draveness.me/whys-the-design-mongodb-b-tree


2019-12-26 17:281020

评论

发布
暂无评论
发现更多内容

nested exception is java.lang.IllegalStateException: refreshAfterWrite requires a LoadingCache异常解决

谙忆

从数据中台到AI中台,企业到底要建什么中台?

脑极体

基于 grpc,protobuf搭建 server/client模型通信

是老郭啊

2.1.2 类加载器的工作原理与自定义加载器 -《SSM深入解析与项目实战》

谙忆

真正的勇士,会跨过六道裂谷,奔向云与AI的彼端

脑极体

DevOps 技术栈

柴锋

Linux DevOps 运维 敏捷 Shell

原来你是这样的B+树

Java技术宝典

B+树

多省市出台关于区块链人才引进的计划

CECBC

新基建 区块链技术

如何对 ElasticSearch 集群进行压力测试

白宦成

elasticsearch ELK Elastic Stack

troubleshoot之:用control+break解决线程死锁问题

程序那些事

Java JVM 死锁

数据采集能力受限?企业数字化运营如何迈出第1步

易观大数据

机器学习算法之——卷积神经网络(CNN)原理讲解

迈微AI研发社

学习 算法 卷积神经网络 CNN

ARTS-week-2

saddamwilson

ARTS 打卡计划

如何设计实现一个证书加密签名工具包

三尾鱼

知路,然后智行远;懂行,所以万业兴

脑极体

ARTS Week8

丽子

List 和 Map 的排序

一盐难进

Java

机器学习算法之——K最近邻(k-Nearest Neighbor,KNN)分类算法原理讲解

迈微AI研发社

学习 算法 KNN K聚类

HTTPS证书过期导致的故障

焦振清

运维 https SRE 服务故障 证书过期

2.2.1 类反射 -《SSM深入解析与项目实战》

谙忆

# spring boot自定义线程池进行异步调用

一盐难进

Java

服务器与普通电脑的区别?

德胜网络-阳

Go: 互斥锁和饥饿

陈思敏捷

mutex Go 语言

以区块链为基础 通证经济是下一代互联网的数字经济

CECBC

区块链 落地应用

区块链跃升各国创新战略

CECBC

新基建 国家战略 区块链标准

区块链+收藏品,全球三种典型应用路径的差异化

CECBC

区块链 应用价值

Kafka处理请求的全流程解析

yes

kafka 面试 后端 消息队列 源码解析

踩坑记 | Flutter升级影响了NestedScrollView?

哈利迪

android

你为什么还在用存储过程?

架构师修行之路

数据库设计 架构设计

LeetCode题解:24. 两两交换链表中的节点,递归,JavaScript,详细注释

Lee Chen

大前端 LeetCode

JDK1.8新特性(七):默认方法,真香,开动!接口?我要升级!!

xcbeyond

接口 新特性 JDK1.8 默认方法 JDK1.8新特性

为什么 MongoDB 使用 B 树 (一)_语言 & 开发_Draveness_InfoQ精选文章