QCon 演讲火热征集中,快来分享技术实践与洞见! 了解详情
写点什么

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

评论

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

得物技术Filament Creator材质编辑工具的实现

得物技术

模型 3D模型 3D 渲染 引擎

做SAP freelancer 的几个注意事项

SAP虾客

SAP freelancer 黑名单 业界名声

云端的 ABAP Restful 服务开发以及通过 abapGit 传输到其他系统的详细步骤

汪子熙

git SAP abap 5月月更 abapgit

云原生数据库的下一次变革发生在哪里?

亚马逊云科技 (Amazon Web Services)

数据库 云原生

【高并发】优化加锁方式时竟然死锁了!!

冰河

并发编程 多线程 高并发 协程 异步编程

Docker下RabbitMQ四部曲之一:极速体验(单机和集群)

程序员欣宸

Java RabbitMQ 5月月更

当前中小企业网络营销缺少的三个方面

源字节1号

前端开发 后端开发 小程序开发 网站开发

Yii2文件/图片上传实例

Owen Zhang

php

怎样让智能电视更加智能

Geek_99967b

小程序 小程序容器 智能电视

全栈、云原生的数据分析时代已来,我们如何抓住机会?

亚马逊云科技 (Amazon Web Services)

数据分析 云原生 全栈

IM即时通讯为企业业务移动化带来了怎样的便利?

BeeWorks

建站建设必备的资料是什么?

源字节1号

软件开发

web前端培训 | 代码如何配置规范并格式化

@零度

前端开发

开源生态|打造活力开源社区,共建开源新生态!

Orillusion

开源 WebGL 元宇宙 Metaverse webgpu

案例成果展 | 灵雀云助力中国人民银行清算总中心构建裸金属容器平台

York

灵雀云 容器 微服务 云原生

刷新三项世界纪录!浪潮云ICP ARM架构获SPEC Cloud测试全球第一名

云计算

大咖说|Kubernetes自动伸缩实现方式深度讲解

云智慧AIOps社区

云计算 微服务 云原生 #Kubernetes#

什么是知识管理?知识管理的方法?

小炮

数据指标体系如何搭建才最有效,从0到1带你快速入门丨02期直播回顾

袋鼠云数栈

5G 时代,我们需要更便捷的RTC技术服务

HIFIVE音加加

RTC 音乐

Linux环境显式使用动态库

Loken

音视频 5月月更

企业上云,安全合规如何进阶 ——一文拆解亚马逊云科技云安全理念与实践

亚马逊云科技 (Amazon Web Services)

云安全 亚马逊云

【LeetCode】房屋偷盗Java题解

Albert

LeetCode 5月月更

【直播回顾】Hello HarmonyOS进阶课程第四课——ArkUI动画开发

HarmonyOS开发者

HarmonyOS

确保 Kubernetes 安全合规的 6 个最佳实践

Rancher

Kubernetes k8s rancher

一款免费的排队叫号工具,居然有这么多功能,赶紧收藏起来!

天天预约

小程序 SaaS 工具分享 排队

什么是小程序运行时框架?

Geek_99967b

native 小程序容器 小程序开发

Kubernetes Gateway API - 服务网络的演进

Flomesh

Kubernetes Gateway ingress

打码打码Python爬虫,某省建筑市场请求地址参数分析,手慢无爬虫

梦想橡皮擦

5月月更

JVM进阶(十九)——Class文件常量池

No Silver Bullet

JVM class 5月月更

面试突击51:为什么单例一定要加 volatile?

王磊

Java 面试

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