写点什么

为什么 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:281342

评论

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

Builder构建者模式,将复杂对象的创建过程与其表示分离,活学活用才是王道

爱好编程进阶

Java 程序员 后端开发

GC:你要用什么方式把我丢掉?

爱好编程进阶

Java 程序员 后端开发

JAVA为什么需要注解?

源字节1号

直播预告丨Hello HarmonyOS进阶课程第二课——计算机视觉

HarmonyOS开发者

HarmonyOS 图形图像 视觉开发

CGBTN2110-DAY07总结复习

爱好编程进阶

Java 程序员 后端开发

Dropzone

爱好编程进阶

Java 程序员 后端开发

ICT架构体系详细说明【3】

爱好编程进阶

程序员 后端开发

如何开发 LAXCUS 分布式应用软件(二):基本构成

LAXCUS分布式操作系统

集群架构 并行计算 分布式操作系统 分布式应用

C++std命名空间和头文件详解

爱好编程进阶

Java 程序员 后端开发

七大章节解读「中台」的前世今生

菜根老谭

中台 中台架构

GitHub成功收获87

爱好编程进阶

Java 程序员 后端开发

大数据培训HBase读写性能优化的详解

@零度

大数据 HBase

Github标星28K+,这款可视化的对象存储服务真香

爱好编程进阶

Java 程序员 后端开发

时序数据库为万物互联打下坚实的基石

华为云开发者联盟

数据仓库 物联网 时序数据库 GaussDB 时序数据

火山引擎入选“2022 中国边缘计算20强”榜单

火山引擎边缘云

边缘计算

GitHub上最牛逼的Java教程,标星yyds:算法

爱好编程进阶

Java 程序员 后端开发

秒云助力上海金融信息技术应用创新联合攻关基地正式上线信创容器云平台

MIAOYUN

云原生 信创 智能运维 一云多芯解决方案

Byte和bit

爱好编程进阶

Java 程序员 后端开发

Flink与Spark Streaming在与kafka结合的区别!

爱好编程进阶

Java 程序员 后端开发

Github上都在疯找的阿里内部“全栈技能修炼”终于来了

爱好编程进阶

Java 程序员 后端开发

案例分享|一键式自动监测,跨境电商平台的业务转型模板

博睿数据

博睿数据 数据链DNA

Apriori算法详解

爱好编程进阶

Java 程序员 后端开发

Day308

爱好编程进阶

Java 程序员 后端开发

Dubbo的超时和重试

爱好编程进阶

Java 程序员 后端开发

Hadoop 3

爱好编程进阶

Java 程序员 后端开发

十年磨一剑|沃趣数据库云产品战略首发

沃趣科技

云原生 公有云 私有云 数据库云 沃趣科技

HarmonyOS 94个JS/eTS开源组件首发上新,肯定有你要用的一款!

HarmonyOS开发者

HarmonyOS ArKUI 3.0

Docker:第二章:部署项目

爱好编程进阶

Java 程序员 后端开发

Hadoop05【命令操作】

爱好编程进阶

Java 程序员 后端开发

TASKCTL分布式任务调度平台-流程控制原理

敏捷调度TASKCTL

程序员 DevOps 分布式 大数据运维 TASKCTL

Swoole 定时器能实现毫秒级任务调度,你敢相信吗?

CRMEB

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